




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章,Socket网络编程,Sunny Liu weiliu_,本课教学内容,客户/服务器模型 协议 Socket Socket概况 IP地址和端口 创建Socket 输入包 创建服务器应用程序 用于服务器的类和方法,本课教学内容,创建服务器 监听客户请求 启动服务器 创建网络客户机所需的类和方法 创建Socket类的对象 从套接字读和写入套接字 关闭连接,问题陈述,应用场景 需要在Java中开发一个服务器应用程序,其功能说明如下: 服务器应该能从客户机的Frame窗口接收用户登录信息。 服务器应该能够将用户信息返回给客户。 服务器应支持多线程,同时应该能为任何数量的客户机提供服务。 服务器运行在端口#1432上。,客户/服务器模型,简介 客户/服务器模型是一种内部数据处理和存储与数据显示相分离的应用程序开发结构。 客户请求服务器而服务器完成这些请求。这些请求通过网络传到服务器。 由于服务器所作的处理对客户是隐藏的。一个服务器可以服务多台客户机。,客户/服务器模型,通信原理 客户机与服务器之间使用的大部分通信组件都是基于Socket接口来实现的 Socket是两个程序之间进行双向数据传输的网络通信端点,由一个IP地址和一个端口号来标识 每个服务器程序在提供服务时都要在一个端口进行,而想使用该服务的客户机也必须连接到该端口。,客户/服务器模型,客户机/服务器工作模式:,协议,定义 数据以包的形式从一台机器传到另一台机器。规则负责把打包数据放进包里,传送速度以及重建数据回到其原来形式。这些规则称为网络协议。,协议,TCP 协议和UDP 协议 TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。 UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。,Socket,Socket概况 Socket是基类,支持TCP协议。 Socket类提供流I/O方法,使从Socket读出和写进方便。 Server Socket是由因特网服务器程序用于响应客户请求的类。Server Socket实际上并不完成服务,而是为客户创建Socket对象。通信在创建的对象之间进行。,Socket,Socket类和ServerSocket类的构造方法: Socket(InetAddress address, int port); Socket(InetAddress address, int port, boolean stream); Socket(String host, int prot); Socket(String host, int prot, boolean stream); Socket(SocketImpl impl) Socket(String host, int port, InetAddress localAddr, int localPort) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) ServerSocket(int port); ServerSocket(int port, int backlog); ServerSocket(int port, int backlog, InetAddress bindAddr),Socket,IP地址和端口 TCP协议需要两个数据项:IP地址和端口号。 每个协议都有缺省的端口号,如果端口号未指定,就使用它,Socket,创建Socket 下面是一个典型的创建客户端Socket的代码:,try Socket socket=new Socket(““,1432); /是TCP/IP协议中默认的本机地址 catch(IOException e) System.out.println(“Error:“+e); ,Socket,输入包 使用import语句,为网络输入必要的包。例如: import .*; import java.io.*;,创建服务器应用程序,用于服务器的类和方法 要创建服务器,你需要创建ServerSocket对象监听客户请求的特定端口。 当它认出有效请求,服务器Socket获得客户创建的Socket对象。用这Socket产生位于服务器和客户机之间的通信。,创建服务器应用程序,ServerSocket类 ServerSocket类的构造函数带两个参数 :第一个是端口号码 ;第二个参数表示可连接的最大数。 ServerSocket类提供如下方法: 监听连接 返回地址和本机端口 返回表示Socket的串,创建服务器应用程序,创建服务器 构造函数的代码给出如下:,try server = new ServerSocket(1432); /创建一个ServerSocket在端口1432监听客户请求 catch (Exception e) System.out.println(“can not listen to:“ + e); /出错,打印出错信息 System.out.println(“Server started“); this.start(); /启动线程,创建服务器应用程序,监听客户请求 ServerSocket对象通过accept()方法来监听客户的请求,如果接收到客户的请求,则产生一个Socket对象,并继续执行后面的代码;如果没有接收到客户请求,则产生一个错误信息。,创建服务器应用程序,代码,Socket socket = null; try socket = server.accept(); /使用accept()阻塞等待客户请求,有客户 /请求到来则产生一个Socket对象,并继续执行 catch (Exception e) System.out.println(“can not listen to:“ + e); /出错,打印出错信息 ,创建服务器应用程序,服务器的输入和输出流 服务器端用到了以下的输入和输出流: BufferedReader对象用来表示从客户端输入到服务器的流 PrintWriter对象表示服务器端输出到客户端的流 BufferedReader对象表示从系统标准输入设备输入到服务器端的流。,创建服务器应用程序,代码如下:,BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream(); /由Socket对象得到输入流,并构造相应的BufferedReader对象 PrintWriter os = new PrintWriter(socket.getOutputStream(); /由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader sin = new BufferedReader(new InputStreamReader(System.in); /由系统标准输入设备构造BufferedReader对象 new Server(); ,创建服务器应用程序,完整的服务器程序 服务器程序创建了一个BufferedReader对象(is)和一个PrintStream对象(os)。is使用getInputStream()方法检索客户端的输入;os使用getOutputStream()方法使得服务器可以把输出写到客户端。这样一来,就开始了双向通信。 当客户连接到服务器时,服务器在标准输出上打印从客户端读入的字符串,然后由BufferedReader对象sin的readline()方法从标准输入读入一字符串,并发送到客户端程序。当有一方输入”bye”时,通信结束。,创建服务器应用程序,到了结束的时候,服务器中断循环。关闭客户套接字。关闭套接字很重要,如果让连接开着,很快就将耗尽服务器的内存。,创建服务器应用程序,ObjectInputStream类 ObjectInputStream类中包含从持久的存储介质中读出类的对象的功能。持久的存储介质可以是磁盘或套接字。 这由ObjectInputStream类的readObject()方法来完成。readObject()方法的语法如下: FileInputStream fp=new FileInputStream(“data.txt”); ObjectInputStream istream = new ObjectInputStream(fp); Date date = (Date)istream.readObject();,实例分析,解题思路 步骤1:选择创建网络服务器应用程序所需的类和方法。 步骤2:确定用户定义的类,它们的目的,方法。 步骤3:确定用户定义的类中的数据类型和变量。 步骤4:确定服务器的IP地址和端口号。 步骤5:确定查询参数。 步骤6:确定要处理的异常。 步骤7:确定异常的出错信息。,任务求解,步骤1:选择创建网络服务器应用程序所需的类和方法 创建服务器应用程序需要用到:ServerSocket类的accept()方法;Thread类的start()和run()方法;Socket类的getInputStream()方法;以及ObjectInputStream类的readObject()方法。,任务求解,步骤2:确定用户定义的类,它们的目的,方法 用户定义了FrameServer类,用于监听客户请求,包含run()方法;定义了Connection类,用于从客户端检索数据,包含Connection(),run()方法;定义了User类,用于保留登录信息。,任务求解,步骤3:确定用户定义的类中的数据类型和变量 用户在FrameServer类中定义了serverSocket一个变量 在Connection类中定义了netClient, fromClient, toClient三个变量 在User类中定义了name, passwords两个变量。,任务求解,步骤4:确定服务器的IP地址和端口号 服务器的IP地址是:,端口是1432。 步骤5:确定提交的参数 提交的参数是: name, passwords,任务求解,步骤6:确定要处理的异常 NotSerializableException异常 当一个对象需要实现Serializable接口时,发生NotSerializableException异常。 IOException异常 IONotSerializableException异常意味着发生了某类输入/输出异常。所以当调用readObject()方法时,分别处理IOException异常,NotSerializableException异常。当创建Thread对象,调用accept()方法以及调用getInputStream()方法时,处理Exception异常。,任务求解,步骤7:确定异常的出错信息 NotSerializableException异常的出错信息是:”读取对象出错”后跟异常对象。 IOException(for thread) 异常的出错信息是:” 不能打开服务器。”后跟异常对象。 IOException(for accept() 异常的出错信息是:” 没有监听”后跟异常对象。 IOException(for getInputStream()异常的出错信息是:” 不能建立双向流管道”后跟异常对象。,任务求解,编写服务器程序,问题陈述,应用场景 需要修改UserFrame,使其连接到现有的网络服务器应用程序上,并发送用户信息。用户登录的代码模板如下所示:,import java.awt.*; import javax.swing.*; public class UserFrame extends JFrame JPanel panel; JLabel labelName; JLabel labelPass; JTextField texName; JPasswordField textPass; JButton butLogin,butCancel; GridLayout gl;,问题陈述,public UserFrame() gl=new GridLayout(2,3); panel=new JPanel(); getContentPane().add(panel); panel.setLayout(gl); labelName=new JLabel(“用户名“); labelPass=new JLabel(“密码“); texName=new JTextField(20); textPass=new JPasswordField(20); butLogin=new JButton(“登录“); butCancel=new JButton(“取消“); panel.add(labelName); panel.add(texName); panel.add(butLogin); panel.add(labelPass); panel.add(textPass);,问题陈述,panel.add(butCancel); public static void main(String args) UserFrame= new UserFrame(); ,所需的类和方法,创建Socket类对象 创建一个套接字客户机的第一步是创建Socket对象。Socket类的构造函数带两个参数IP地址和服务器监听的端口号。例如: Socket socket=new Socket(““,1432);,所需的类和方法,从套接字读和写入套接字 从套接字读和写类似于从文件中读和写。说明两个对象,分别是PrintStream类和BufferedReader类。这些对象将用于从Socket读和写。 PrintStream out = null; /写入套接字 BufferedReader in = null; /从套接字读,所需的类和方法,从套接字读和写入套接字 连接PrintStream和BufferedReader对象至socket。例如: PrintStream out = new PrintWriter(socket.getOutputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(); Socket类的getInputStream()和getOutputStream()方法使客户能和服务器通信。 getInputStream()方法用于从Socket读 getOutputStream()方法用于写进Socket。,所需的类和方法,从套接字读和写入套接字 为了和标准输入相联系,需要说明另一个BufferedReader类的对象,以致输入客户的数据能被传送至服务器。,BufferedReader sin = new BufferedReader(new InputStreamReader(System.in); String readline; readline = sin.readLine(); /从系统标准输入读入一字符串 while (!readline.equals(“bye“) ,所需的类和方法,关闭连接 下列语句关闭流以及和服务器的连接: os.close(); /关闭Socket输出流 is.close(); /关闭Socket输入流 socket.close(); /关闭Socket,所需的类和方法,程序示例 下列程序实现简单的连接到服务器的Socket客户机,套接字客户机接收用户输入的字符串并允许双向通信。为终止连接,用户必须输入bye。,所需的类和方法,程序代码,import java.io.*; import .*; public class TalkClient public static void main(String args) try Socket socket = new Socket(““, 1001); /向本机的1001端口发出客户请求 BufferedReader sin = new BufferedReader(new InputStreamReader(System.in); /由系统标准输入设备构造BufferedReader对象 PrintWriter os = new PrintWriter(socket.getOutputStream(); /由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream(); /由Socket对象得到输入流,并构造相应的BufferedReader对象,所需的类和方法,String readline; readline = sin.readLine(); /从系统标准输入读入一字符串 while (!readline.equals(“bye“) /若从标准输入读入的字符串为 “bye“则停止循环 os.println(readline); /将从系统标准输入读入的字符串输出到Server os.flush(); /刷新输出流,使Server马上收到该字符串 System.out.println(“Client:“ + readline); /在系统标准输出上打印读入的字符串 System.out.println(“Server:“ + is.readLine(); /从Server读入一字符串,并打印到标准输出上 readline = sin.readLine(); /从系统标准输入读入一字符串 /继续循环 os.close(); /关闭Socket输出流 is.close(); /关闭Socket输入流 socket.close(); /关闭Socket ,所需的类和方法,catch (Exception e) System.out.println(“Error“ + e); /出错,则打印出错信息 ,所需的类和方法,ObjectOutputStream类 ObjectOutputStream类具有将类的对象写入持久存储介质的功能 . 持久的存储介质可以是磁盘或套接字。这由ObjectOutputStream类的writeObject()方法完成 . writeObject()方法的语法如下: FileOutputStream fp = new FileOutputStream(“data.txt”); ObjectOutputStream ostream = new ObjectOutputStream(fp); Date date = new Date(); Ostream.writeObject(Date)date);,实例分析,任务单,实例分析,实例分析,步骤1:选择创建网络客户机所需的类和方法。 创建网络客户机,用到了Socket类的getOutputStream()方法和ObjectOutputStream类的writeObject()方法。 步骤2:确定用户定义的类,它们的目的,方法 用户定义了User类,来保留申请人的信息;定义了UserFrame类。,实例分析,步骤3:确定用户定义类中的数据类型和变量 用户在程序中定义了如下数据变量: class
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 少儿台球基础知识培训班课件
- 少儿保险知识培训总结
- 少儿体育培训冷知识课件
- 文库发布:小黑鱼课件
- 小鸭鸭去上学课件
- 人防工程抗生化能力增强方案
- 九年级数学圆的性质与应用题集
- 2024年度国家公务员录用考试行测试题及答案解析-判断推理
- 医疗废物分类处理流程培训试题及答案解析
- 温室效应与全球变暖课件
- 2025-2030中国辣椒酱行业供需趋势及投资风险研究报告
- 2025年度运输业安全生产知识竞赛试题(附答案)
- 光伏居间的合同8篇
- GB/T 45418-2025配电网通用技术导则
- 医疗风险防控培训课件
- 机械设计部绩效考核制度
- 诊疗规范培训课件
- 《KANO模型培训》课件
- 复苏室患者的交接流程
- DB21-T 2523-2015矿山地质环境恢复治理规程
- 新能源集控中心建设方案
评论
0/150
提交评论