资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
实验5-2 Socket网络编程,实验目的 掌握Socket的TCP通信、 Socket的UDP通信 实验内容 Socket、ServerSocket类和DatagramPacket 、DatagramSocket类的使用 实验环境和要求 使用Windows操作系统;Internet连接 Eclipse+Java开发环境,网络编程模型,java.net包中的主要的类和可能产生的例外包括: 面向应用层的类:URL、URLConnection 面向传输层/IP层的类: TCP协议相关类:Socket、ServerSocket UDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket 表示IP 地址的类: InetAddress 可能产生的异常: BindException、ConnectException、 MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、 UnknownHostException、UnknownServiceException,Java对网络编程的支持,套接字(Socket),套接字 用于实现网络上客户端程序和服务器程序之间的连接。 套接字负责网络上进程之间的通信 客户端程序可以向套接字里写入请求,然后服务器会处理这个请求,并把处理结果通过套接字送回。 服务器应用程序一般会侦听一个特定端口,用来等待客户的连接请求,当一个连接请求到达时,客户和服务器会建立一个通信连接,在连接过程中,客户被分配一个本地端口号并与一个Socket连接,客户通过写Socket来通知服务器,再通过读取Socket来获取服务器发送过来的信息。 类似地,服务器也获取一个本地端口号,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也给它的本地端口连接一个Socket,通过读写它来与客户通信。,(续),Socket可以根据通信性质分类,这种性质对于用户是可见的。 应用程序一般仅在同一类的套接字之间进行通信。不过只要底层的通信协议允许,不同类型的套接字之间也可以通信。 目前可以使用两种套接字,即流套接字和数据报套接字。 流套接字提供了双向的、有序的、无重复的并且无记录边界的数据流服务。 TCP是一种流套接字协议 数据报套接字支持双向的数据流,但并不保证是可靠、有序、无重复的,也就是说,一个以数据报套接字来接收信息的进程有可能发现信息重复了,或者和发出的顺序不同了。数据报套接字的一个重要特点是它保留了记录边界。 UDP即是一种数据报套接字协议。,端口,端口 是一个逻辑概念。每一个服务器都运行在该主机的一个对外开放的端口上。 一个主机上可以有多种服务器,也就是有多个端口。程序员可以在创建自己的服务器程序时使用其它端口(即除了系统默认的端口)。 端口常以数字编号,作为客户可指定一个端口号,用这个端口号来连接相应的服务器以接收服务。 如果把 IP 地址看作电话号码,则端口类似电话的分机号码,cmdnetstat na 可以查看本机的端口使用情况。,Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点,IP与端口的组合得出一个套接字,可以完全分辨Internet上运行的程序,Socket通信TCP,一对一的Socket C/S通信 TCP是一种可靠的、基于连接的网络协议,在Internet上大都采用TCP/IP协议进行互联。网络上的两个进程采用C/S模式进行通信。 当两台主机准备进行交谈时,都必须建立一个Socket,其中一方作为服务器打开一个Socket并侦听来自网络的连接请求,另一个作为客户,它向网络上的服务器发送请求,通过Socket与服务器传递信息,要建立连接,只需指定主机的IP地址和端口即可。,Socket 工作模式,1、概述 Java提供Socket和ServerSocket类作为标准的TCP套接字编程技术,通过它们实现主机与主机之间(应用程序间)的对话。位于:java.net包中。 使用Socket进行C/S程序设计的一般连接过程: Server端Listen(监听)某个端口是否有连接请求, Client端向Server端发出Connect(连接)请求, Server端向Client端发回Accept(接受)消息。 连接建立后,Server端和Client端都可以通过套接字类提供的一些方法与对方通信。,使用TCP协议的Socket编程,2、Socket类的构造方法: public Socket(String host, int port) public Socket(InetAddress address, int port) public Socket(String host, int port, InetAddress localAddr, int localPort) /在指定的机器上的指定端口上运行 上述方法都将抛出例外IOException,程序中需要捕获处理。,使用TCP协议的Socket编程,3、Socket的常见方法: /Socket的输入/输出流管理;抛出例外IOException。 public InputStream getInputStream() public void shutdownInput() public OutputStream getOutputStream() public void shutdownOutput() /关闭Socket public void close() throws IOException /设置/获取Socket数据: public InetAddress getInetAddress() 返回此套接字链接的地址对象 public InetAddress getLocalAddress() 返回此套接字本地的地址对象 public int getPort() 返回此套接字链接地址的端口 上述方法都将抛出例外SocketException,程序中需要捕获处理。,使用TCP协议的Socket编程,4、ServerSocket类 构造方法: public ServerSocket(int port) public ServerSocket(int port, int backlog) /支持指定数目的连接 public ServerSocket(int port, int backlog, InetAddress bindAddr) /在指定的机器上运行 主要方法 public Socket accept():等待客户端的连接 public void close():关闭Socket 设置/获取Socket数据的方法 public InetAddress getInetAddress() public int getLocalPort(),,使用TCP协议的Socket编程,5、Socket通信程序基本结构都一样,包括以下四个基本步骤: 1、在客户方和服务器方创建Socket/ServerSocket实例。 2、打开连接到Socket的输入/输出流。 3、利用输入/输出流,按照一定的协议对Socket进行读/写操作。 4、关闭输入/输出流和Socket。 通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的。,使用TCP协议的Socket编程,使用TCP协议的Socket编程,Socket,创建Socket 下面是一个典型的创建客户端Socket的代码:,try Socket socket=new Socket(“127.0.0.1“,1432); /127.0.0.1是TCP/IP协议中默认的本机地址 catch(IOException e) System.out.println(“Error:“+e); ,创建服务器应用程序,用于服务器的类和方法 要创建服务器,你需要创建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类
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号