




已阅读5页,还剩153页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章JAVA网络编程技术 主讲 朱会东E Mail zhd168 1 第11章JAVA网络编程技术 本章将介绍Java网络通信原理 重点介绍4个重要的类 URL Socket InetAddress DatagramSocket 讲解它们在网络编程中的重要作用 详细讨论与之相关的类及其使用方法 Java支持TCP和UDP协议族 TCP用于网络的可靠的流式输入 输出 UDP支持更简单的 快速的 点对点的数据报模式 2 11 1网络通信基本知识 11 2URL编程技术 11 3TCP编程技术 11 4UDP编程技术 11 5本章小结 内容简介 3 11 1网络通信基本知识 11 1 1网络通信基本概念 11 1 2TCP协议和UDP协议 11 1 3Java网络程序设计技术 4 11 1 1网络通信基本概念 计算机网络是指通过各种通信设备连接起来的 支持特定网络通信协议的 许许多多的计算机或计算机系统的集合 网络通信是指网络中的计算机通过网络互相传递信息 通信协议是网络通信的基础 通信协议是网络中计算机之间进行通信时共同遵守的规则 不同的通信协议用不同的方法解决不同类型的通信问题 5 11 1 1网络通信基本概念 为了实现网络上不同机器之间的通信 着重介绍 6 11 1 1网络通信基本概念 IP地址 IP地址是计算机网络中任意一台计算机地址的唯一标识 知道了网络中某一台主机的IP地址 就可以定位这台计算机 通过这种地址标识 网络中的计算机可以互相定位和通信 目前 IP地址有两种格式 即IPV4格式和IPV6格式 IPV4是由4个字节数组成 中间以小数点分隔 IPV6是由16个字节组成 中间以冒号分隔 IP地址如 166 111 136 3 166 111 52 80 7 11 1 1网络通信基本概念 域名地址 域名地址是计算机网络中一台主机的标识名 也可以看做是IP地址的助记名 在Internet上 一个域名地址可以有多个IP地址与之相对应 一个IP地址也可以对应多个域名 通过主机名到IP地址的解析 可以由主机名得到对应的IP地址 在访问网上资源时 一般只需记住服务器的主机名就可以了 因为网络中的域名解析服务器可以根据主机名查出对应的IP地址 主机名 hostname 如 8 11 1 1网络通信基本概念 端口号 一台主机上允许有多个进程 这些进程都可以和网络上的其他计算机进行通信 更准确地说 网络通信的主体不是主机 而是主机中运行的进程 端口就是为了在一台主机上标识多个进程而采取的一种手段 主机名 或IP地址 和端口的组合能唯一确定网络通信的主体 进程 端口 port 是网络通信时同一主机上的不同进程的标识 端口号 portnumber 如 80 21 23 25 9 11 1 2TCP协议和UDP协议 1 TCP TransferControlProtocol的简称 协议是一种面向连接的 可以提供可靠传输的协议 使用TCP协议传输数据 接收端得到的是一个和发送端发出的完全一样的数据流 2 UDP UserDatagramProtocol的简称 是一种无连接的协议 它传输的是一种独立的数据报 Datagram 每个数据报都是一个独立的信息 包括完整的源地址或目的地址 10 11 1 2TCP协议和UDP协议 两种协议的比较 11 11 1 2TCP协议和UDP协议 两种协议的比较 12 11 1 3Java网络程序设计技术 URL编程技术 TCP编程技术 UDP编程技术 URL表示了Internet上某个资源的地址 通过URL标识 可以直接使用各种通信协议获取远端计算机上的资源信息 方便快捷地开发Internet应用程序 UDP是无连接的快速通信技术 数据报通信不需要建立连接 通信时所传输的数据报能否到达目的地 到达的时间 到达的次序都不能准确知道 TCP是可靠的连接通信技术 主要使用套接字 Socket 机制 TCP通信是使用TCP IP协议 建立在稳定连接基础上的 以流传输数据的通信方式 13 11 1 3Java网络程序设计技术 按层次及使用方法Java的网络功能分为四大类InetAddress面向IP层 用于标识网络上的硬件资源URL面向应用层 可以通过URL的网络资源表达形式确定数据在网络中的位置Socket面向传输层 使用的是TCP协议Datagram面向传输层 使用的是UDP协议 是另一种网络传输方式 它把数据的目的地记录在数据包中 然后直接放在网络上 14 主要的类 15 11 2URL编程技术 11 2 1URL和URL类 1 11 2 2URLConnection类 2 11 2 3InetAddress类 3 16 11 2 1URL和URL类 URL类是对统一资源定位符 UniformResourceLocator 的抽象 使用URL创建对象的应用程序称作客户端程序 一个URL对象存放着一个具体的资源的引用 表明客户要访问这个URL中的资源 利用URL对象可以获取URL中的资源 URL对象通常包含最基本的三部分信息 协议 地址 资源 17 11 2 1URL和URL类 1 URL的格式 传输协议名 主机名 端口号 件名 引用 传输协议名 指定获取资源所使用的传输协议 主机名 是网络中的计算机名或IP地址 端口号 是计算机中代表一个服务的进程的编号 文件名 是服务器上包括路径的文件名称 引用 是文件中的标记 可用于同一个文件中的跳转 服务类型 service http telnet ftp smtp 18 11 2 1URL和URL类 2 URL类 URL类是Java语言提供的支持URL编程的基础类 其类路径是 URL URL Stringspec 该构造方法根据指定的字符串创建URL对象 如果字符串指定了未知协议 则抛出异常 URL Stringprotocol Stringhost Stringfile 该构造方法根据指定的协议 主机和文件名称创建URL URL Stringprotocol Stringhost intport Stringfile 该构造方法根据指定协议 主机 端口号和文件创建URL对象 构造方法 19 11 2 1URL和URL类 try url newURL catch MalformedURLExceptione System out println BadURL url 20 11 2 1URL和URL类 一个URL对象生成后 其属性是不能被改变的 但可以通过它给定的方法来获取这些属性 publicStringgetProtocol 获取该URL的协议名publicStringgetHost 获取该URL的主机名publicStringgetPort 获取该URL的端口号publicStringgetPath 获取该URL的文件路径publicStringgetFile 获取该URL的文件名publicStringgetRef 获取该URL在文件中的相对位置publicStringgetQuery 获取该URL的查询名 21 11 2 1URL和URL类 例11 1 使用URL类获取远端主机上指定文件的内容 创建一个参数为 程序 22 URL MalformedURLException publicclassJ Url publicstaticvoidmain Stringargs try URLu newURL 23 11 2 1URL和URL类 通过URL类提供的方法openStream 就可以读取一个URL对象所指定的资源 publicfinalInputStreamopenStream 方法openStream 与指定的URL建立连接并返回一个InputStream对象 将URL位置的资源转成一个数据流 通过这个InputStream对象 就可以读取资源中的数据 读取URL中的资源 24 publicclassURLReader publicstaticvoidmain String args throwsException URLtirc newURL PrintWriterout newPrintWriter newFileWriter outfile while inputLine in readLine null 从输入流中不断读取数据直到读完为止out println inputLine 把读入的数据写入test html in close 关闭输入流out close 25 11 2 2URLConnection类 通过URL类提供的方法openConnection 就可以获得一个URL连接 URLConnection 对象 publicURLConnectionopenConnection 通过URL的方法openStream 只能从网络上读取资源中的数据 通过URLConnection类 可以在应用程序和URL资源之间进行交互 既可以从URL中读取数据 也可以向URL中发送数据 URLConnection类表示了应用程序和URL资源之间的通信连接 26 11 2 2URLConnection类 1 2 3 4 TEXT TEXT TEXT TEXT 应用程序和URL建立连接的步骤 通过在URL上调用openConnection方法创建连接对象 处理设置参数和一般请求属性 远程对象变为可用 远程对象的头字段和内容变为可访问 使用connect方法建立到远程对象的实际连接 27 下面的程序段首先生成一个指向地址 try URLzzuli newURL URLConnectonntc zjut openConnection catch MalformedURLExceptione 创建对象失败 catch IOExceptione openConnection 失败 11 2 2URLConnection类 28 11 2 2URLConnection类 URLConnection类的几个主要变量如下 1 URLConnection类的几个主要变量如下 connected url 2 URLConnection类的构造方法如下 URLConnection URLurl 创建参数为url的URLConnection对象 29 11 2 2URLConnection类 3 URLConnection类的几个主要方法如下 ObjectgetContent 获取此URL连接的内容 StringgetContentEncoding 返回该URL引用的资源的内容编码 intgetContentLength 返回此连接的URL引用的资源的内容长度 StringgetContentType 返回该URL引用的资源的内容类型 URLgetURL 返回此URLConnection的URL字段的值 InputStreamgetInputSTream 返回从所打开连接读数据的输入流 OutputStreamgetOutputSTream 返回向所打开连接写数据的输出流 publicvoidsetConnectTimeout inttimeout 设置一个指定的超时值 以毫秒为单位 30 11 2 2URLConnection类 程序设计时最常使用的是getInputStream 和getOurputStream 其定义为 InputSteramgetInputSteram OutputSteramgetOutputStream 通过返回的输入 输出流我们可以与远程对象进行通信事实上 类URL的方法openStream 就是通过URLConnection类来实现的 它等价于 openConnection getInputStream 31 11 2 2URLConnection类 URLurl newURL 由URL对象获取URLConnection对象DataInputStreamdis newDataInputStream con getInputSteam 由URLConnection获取输入流 并构造DataInputStreamPrintStreamps newPrintSteam con getOutupSteam 由URLConnection获取输出流 并构造PrintStream对象Stringline dis readLine 从服务器读入一行ps println client 向服务器写出字符串 client 32 11 2 2URLConnection类 例11 2 使用URLConnection类获取Web页面信息 功能实现 使用URLConnection显示网址 程序 33 importjava io URL URLConnection publicclassURLConnectionTest publicstaticvoidmain String args throwsException intch 定义接收连接内容信息的整数URLurl newURL 定义URLConnection对象 并让其指向给定的连接URLConnectionuc url openConnection System out println 文件类型 uc getContentType System out println 文件长度 uc getContentLength System out println 文件内容 System out println 定义字节输入流对象 并使其指向给定连接的输入流InputStreamis uc getInputStream 创建BufferedReader对象while ch is read 1 循环读下一个字节 直到文件结束System out print char ch 输出字节对应的字符 is close 关闭字节流 34 显示URL资源中的html文件 Javax swing包中的JEditorPane容器可以解释执行html文件 也就是说 如果你把html文件读入到JEditorPane 该html文件就会被解释执行 显示在JEditorPane容器中 这样程序就看到了网页的运行效果 35 处理超链接 当JEditorPane对象调用setEditable方法将编辑属性设为false时 不仅可以显示网页的运行效果 而且用户如果单击网页中超链接还可以使得JEditorPane对象触发HyperlinkEvent事件 程序可以通过处理HyperlinkEvent事件 来显示新的URL资源 36 域名地址 IP地址 互联网上表示一个主机的地址有两种方式 11 2 3InetAddress类 37 11 2 3InetAddress类 类InetAddress可以用于标识网络上的硬件资源 它提供了一系列方法以描述 获取及使用网络资源 InetAddress类没有构造函数 因此不能用new来构造一个InetAddress实例 通常是用它提供的静态方法来获取 publicstaticInetAddressgetByName Stringhost host可以是一个机器名 也可以是一个形如 d d d d 的IP地址或一个DSN域名 publicstaticInetAddressgetLocalHost publicstaticInetAddress getAllByName Stringhost 这三个方法通常会产生UnknownHostException例外 应在程序中捕获处理 38 11 2 3InetAddress类 以下是InetAddress类的几个主要方法 publicbyte getAddress 获得本对象的IP地址 存放在字节数组中 publicStringgetHostAddress 获得本对象的IP地址 d d d d publicStringgetHostName 获得本对象的机器名 获得本地主机的IP地址 InetAddressaddr InetAddress getLocalHost 39 11 2 3InetAddress类 下面的例子演示Java如何根据域名自动到DNS 域名服务器 上查找IP地址 与DNS服务器的连接减至一行 publicclassgetIP publicstaticvoidmain Stringargs InetAddresszzuli null try zzuli InetAddress getByName catch UnknownHostExceptione System out println zzuli 40 11 2 3InetAddress类 通过InetAddress 可以获取本机的IP地址 publicclassgetLocalHostTest publicstaticvoidmain InetAddressmyIP null try myIP InetAddress getLocalHost catch UnknownHostExceptione System out println myIP 41 11 3 1网络套接字Socket 11 3 2Socket类 11 3 3ServerSocket类 11 3TCP编程技术 11 3 4C S程序设计实例 42 11 3TCP编程技术 Socket套接字是应用于网络通信中的重要机制 Socket最初是加利福尼亚大学Berkeley分校为UNIX操作系统开发的网络通信接口 随着UNIX操作系统的广泛使用 套接字成为当前最流行的网络通信应用程序接口之一 Java语言中采用的Socket通信是一种流式套接字通信 它采用TCP协议 通过提供面向连接的服务 实现客户 服务器之间双向 可靠的通信 包中的Socket类与ServerSocket类为流式套接字通信方式提供了充分的支持 43 11 3 1网络套接字Socket Socket的概念Socket称为 套接字 也有人称为 插座 是指在两台计算机上运行的两个程序之间的一个双向通信的链接点 而这个双向链路的每一端就称为一个Socket 建立连接的两个程序分别称为客户端 Client 和服务器端 Server 44 11 3 1网络套接字Socket 客户端程序申请连接 而服务器端程序监听所有的端口 判断是否有客户程序的服务请求 当客户程序请求和某个端口连接时 服务器程序就将 套接字 连接到该端口上 此时 服务器与客户程序就建立了一个专用的虚拟连接 客户程序可以向套接字写入请求 服务器程序处理请求并把处理结果通过套接字送回 通信结束时 再将所建的虚拟连接拆除 45 利用Socket进行网络通信分为三个步骤 1 建立Socket连接 在通信开始之前由通信双方确认身份 建立一条专用的虚拟连接通道 2 数据通信 利用虚拟连接通道传送数据信息进行通信 3 关闭 通信结束时 再将所建的虚拟连接拆除 11 3 1网络套接字Socket 46 图Socket通信机制 11 3 1网络套接字Socket 47 11 3 1网络套接字Socket 服务器端的程序首先选择一个端口 port 注册 然后调用accept 方法对此端口进行监听 等待其他程序的连接申请 如果客户端的程序申请和此端口连接 那么服务器端就利用accept 方法来取得这个连接的Socket 客户端的程序建立Socket时必须指定服务器的地址 host 和通信的端口号 port 这个端口号必须与服务器端监听的端口号保持一致 48 Socket类与ServerSocket类J中提供了两个类 ServerSocket类和Socket类 它们分别用于服务器端和客户端的Socket通信 进行网络通信的方法也都封装在这两个类中 11 3 1网络套接字Socket 49 11 3 2Socket类 Socket类实现了客户机端的Socket Socket对象可以用来向服务器发出连接请求 交换数据 Socket类的构造方法如下 publicSocket Stringhost intport publicSocket InetAddressaddress intport publicSocket Stringhost intport InetAddresslocalAddr intlocalPort publicSocket InetAddressaddress intport InetAddresslocalAddr intlocalPort 这些方法都将抛出例外IOException 程序中需要捕获处理 50 在建立Socket对象时进行异常处理 如下面的try catch语句 Socketsocket try socket newSocket ServerName 3561 catch IOExceptione System out println Erroroccurred e 51 11 3 2Socket类 Socket类常用方法如下 52 11 3 3ServerSocket类 服务器必须建立一个等待接收客户的套接字的ServerSocket对象 当服务器的ServerSocket对象server socket建立后 就可以接收客户的套接字连接呼叫 所谓 接收 客户的套接字连接就会返回一个和客户端Socket对象相连接的驻留在服务器端的Socket对 53 11 3 3ServerSocket类 ServerSocket ServerSocket intport ServerSocket intport intbacklog ServerSocket类的构造方法 ServerSocket intport intbacklog InetAddressbindAddr 54 Voidbind SocketAddressendpoint 将ServerSocket绑定到特定地址 Voidbind SocketAddressendpoint intbacklog 在有多个网卡的服务器上 将ServerSocket绑定到特定地址 voidclose 关闭此套接字 ServerSocket类的常用方法 Socketaccept 侦听并接受到此套接字的连接 11 3 3ServerSocket类 55 11 3 3ServerSocket类 intgetLocalPort 返回此套接字在其上侦听的端口 SocketAddressgetLocalSocketAddress 返回此套接字绑定的端点的地址 如果尚未绑定则返回null booleanisBound 返回ServerSocket的绑定状态 ServerSocket类的常用方法 InetAddressgetInetAddress 返回此服务器套接字的本地地址 56 Contents StringtoString 作为String返回此套接字的实现地址和实现端口 ServerSocket类的常用方法 booleanisClosed 返回ServerSocket的关闭状态 11 3 3ServerSocket类 57 11 3 3ServerSocket类 在建立ServerSocket对象和取得Socket对象 ServerSocketserver Socketsocket try server newServerSocket 3561 catch Exceptione System out println Erroroccurred e try socket server accept catch Exceptione System out println Erroroccurred e 58 Socket通信 59 获取输入 输出流 建立Socket连接后 就可以利用Socket类的两个方法getInputStream 和getOutputStream 分别获得向Socket对象读写数据的输入 输出流 例如 try InputStreamins socket getInputStream OutputStreamouts socket getOutputStream catch Exceptione System out println Erroroccurred e 60 读 写数据流 获取Socket对象的输入 输出流后 为了便于进行读 写 需要在这两个流对象的基础上建立易于操作的数据流 如 InputStreamReader OutputStreamReader 或PrintStream 建立数据流可采用如下语句 InputStreamReaderin newInputStreamReader ins BufferedReaderinn newBufferedReader in OutputStreamReaderout newOutputStreamReader outs PrintStreamout newPrintStream outs 61 读 写数据流 要读入一个字符串并将其长度写入输出流中 则可以用如下语句 Stringstr inn readLine Out println str length 62 断开连接 无论是编写服务器程序还是客户端程序 通信结束时 必须要断开连接并释放所占用的资源 Java提供close 方法来断开连接 即 1 关闭Socket对象 socket close 2 关闭ServerSocket对象 server close 63 64 8 5Socket 例 服务器与客户机间的通信 服务器端 PrintStreamps null DataInputStreamdis null Stringusername ServerSocketserverSocket null SocketclientSocket null try serverSocket newServerSocket 1111 catch IOExceptione System out println Error e System exit 1 try clientSocket serverSocket accept catch IOExceptione System out println Acceptfailed System exit 1 创建服务器 端口号 定义数据成员 服务器等待网络连接 65 ps newPrintStream clientSocket getOutputStream dis newDataInputStream clientSocket getInputStream 建立socket流 向客户发出登录要求 ps println login ps flush 66 ps println loginsucessful ps flush System out println username hasloggedoff 读客户端信息 通知客户连接完毕 if username dis readLine null System out println readLinereturnednull System exit 1 System out println Username username 67 例 服务器与客户机间的通信 客户端 创建Socket实例 PrintStreamoutput DataInputStreaminput Stringstring Socketsocket null 定义数据成员 try socket newSocket 127 0 0 1 1111 catch IOExceptione System out println Error e return input newDataInputStream socket getInputStream output newPrintStream socket getOutputStream 建立socket流 68 System out println input readLine 读socket流 看到提示 System in read bArray Strings newString bArray 0 output println s 从键盘上读送用户名送给服务器端 关闭流 socket close input close output close System out println Done System out println input readLine System out print Loggingoff 读服务器反馈 69 11 3 4C S程序设计实例 利用InetAddress类的对象来获取计算机主机信息 示例程序s1 java和c1 java是一个完整的实现Socket通信的Java程序 分别为服务器端程序和客户端程序 在这个程序中 服务器等待与客户端连接 当建立连接后 客户端向服务器端发送一条信息 服务器收到后再向客户端发送一条信息 直到发送bye结束消息传递 并拆除客户端与服务器端的连接 70 示例程序s1 java 服务器端程序 importjava io publicclasss1 publicstaticfinalintport 8000 publicstaticvoidmain Stringargs Stringstr try 在端口port注册服务ServerSocketserver newServerSocket port 创建当前线程的监听对象System out println Started server Socketsocket server accept 负责C S通信的SocketSystem out println Socket socket 11 3 4C S程序设计实例 71 获得对应Socket的输入 输出流InputStreamfIn socket getInputStream OutputStreamfOut socket getOutputStream 建立数据流InputStreamReaderisr newInputStreamReader fIn BufferedReaderin newBufferedReader isr PrintStreamout newPrintStream fOut InputStreamReaderuserisr newInputStreamReader System in BufferedReaderuserin newBufferedReader userisr while true System out println 等待客户端的消息 str in readLine 读客户端传送的字符串System out println 客户端 str 显示字符串 11 3 4C S程序设计实例 72 if str equals bye break 如果是bye 则退出System out print 给客户端发送 str userin readLine out println str 向客户端发送消息if str equals bye break whilesocket close server close trycatch Exceptione System out println 异常 e 11 3 4C S程序设计实例 73 示例程序c1 java 客户端程序 importjava io publicclassc1 publicstaticvoidmain String args Stringstr try InetAddressaddr InetAddress getByName 127 0 0 1 Socketsocket newSocket addr 8000 System out println Socket socket 获得对应socket的输入 输出流InputStreamfIn socket getInputStream OutputStreamfOut socket getOutputStream 11 3 4C S程序设计实例 74 建立数据流InputStreamReaderisr newInputStreamReader fIn BufferedReaderin newBufferedReader isr PrintStreamout newPrintStream fOut InputStreamReaderuserisr newInputStreamReader System in BufferedReaderuserin newBufferedReader userisr while true System out print 发送字符串 str userin readLine 读取用户输入的字符串out println str 将字符串传给服务器端if str equals bye break 如果是 bye 就退出System out println 等待服务器端消息 11 3 4C S程序设计实例 75 str in readLine 获取服务器获得字符串System out println 服务器端字符 str if str equals bye break socket close 关闭连接 catch Exceptione System out println 异常 e 11 3 4C S程序设计实例 76 在本地机器上测试网络程序用回绕地址Socketsocket newSocket 127 0 0 1 4444 建立socket连接后 还应该建立输入输出数据流 要控制好输入 输出流和Socket关闭的时间 如果网络的一端已经关闭 另一端读到null 在运行时 服务器端程序一般应先行启动 77 多线程的TCP通信 在实际的网络环境里 同一时间只对一个用户服务是不可行的 一个优秀的网络服务程序除了能处理用户的输入信息 还必须能够同时响应多个客户端的连接请求 在java中 实现以上功能特点是非常容易的 78 解决方案一 在一台计算机上一次启动多个服务器程序 只要端口号不同 myserver1myclient1myserver2myclient2 多线程的TCP通信 79 解决方案二 将服务器写成多线程的 不同的处理线程为不同的客户服务 主线程只负责循环等待 处理线程负责网络连接 接收客户输入的信息 主线程while true acceptaconnection createathreadtodealwiththeclient endwhile 多线程的TCP通信 80 serverSocket newServerSocket 4444 while listening Socketsocket socket serverSocket accept 程序将在此等候客户端的连接clientNumber 记录客户数目newMultiTalkServerThread socket clientNumber start 创建一个新线程处理此客户请求 serverSocket close classMultiTalkServerThreadextendsThread publicMultiTalkServerThread Socketsocket intclientNumber this socket socket this clientNumber clientNumber publicvoidrun 多线程的TCP通信 81 MultiTalkServer java 多线程的TCP通信 82 Client之间通过Server通信 可以在服务器端将与各客户进行通信的Socket和线程管理起来 从而各客户之间可以在服务器端的协助下进行通信 多线程的TCP通信 83 支持多客户的client server程序设计 在实际应用中 往往是在服务器上运行一个永久的程序 它可以接收来自其他多个客户端的请求 提供相应的服务 为了实现在服务器方给多个客户提供服务的功能 需要对上面的程序进行改造 利用多线程实现多客户机制 服务器总是在指定的端口上监听是否有客户请求 一旦监听到客户请求 服务器就会启动一个专门的服务线程来响应该客户的请求 而服务器本身在启动完线程之后马上又进入监听状态 等待下一个客户的到来 84 importjava io publicclassTalkClient publicstaticvoidmain Stringargs try Socketsocket newSocket 127 0 0 1 4700 向本机的4700端口发出客户请求BufferedReadersin newBufferedReader newInputStreamReader System in 由系统标准输入设备构造BufferedReader对象PrintWriteros newPrintWriter socket getOutputStream 由Socket对象得到输出流 并构造PrintWriter对象BufferedReaderis newBufferedReader newInputStreamReader socket getInputStream 由Socket对象得到输入流 并构造相应的BufferedReader对象Stringreadline readline sin readLine 从系统标准输入读入一字符串while readline equals bye 若从标准输入读入的字符串为 bye 则停止循环os println readline 将从系统标准输入读入的字符串输出到Serveros 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 Exceptione System out println Error e 出错 则打印出错信息 85 importjava io publicclassServerThreadextendsThread Socketsocket null 保存与本线程相关的Socket对象intclientnum 保存本进程的客户计数publicServerThread Socketsocket intnum 构造函数this socket socket 初始化socket变量clientnum num 1 初始化clientnum变量 publicvoidrun 线程主体try Stringline BufferedReaderis newBufferedReader newInputStreamReader socket getInputStream 由Socket对象得到输入流 并构造相应的BufferedReader对象PrintWriteros newPrintWriter socket getOutputStream 由Socket对象得到输出流 并构造PrintWriter对象BufferedReadersin newBufferedReader newInputStreamReader System in 由系统标准输入设备构造BufferedReader对象System out println Client clientnum is readLine 86 在标准输出上打印从客户端读入的字符串line sin readLine 从标准输入读入一字符串while line equals bye 如果该字符串为 bye 则停止循环os println line 向客户端输出该字符串os flush 刷新输出流 使Client马上收到该字符串System out println Server line 在系统标准输出上打印该字符串System out println Client clientnum is readLine 从Client读入一字符串 并打印到标准输出上line sin readLine 从系统标准输入读入一字符串 继续循环os close 关闭Socket输出流is close 关闭Socket输入流socket close 关闭Socketserver close 关闭ServerSocket catch Exceptione System out println Error e 87 importjava io importServerThread publicclassMultiTalkServer staticintclientnum 0 静态成员变量 记录当前客户的个数publicstaticvoidmain Stringargs throwsIOException ServerSocketserverSocket null booleanlistening true try serverSocket newServerSocket 4700 System out println Serverisrunning 创建一个ServerSocket在端口4700监听客户请求 catch IOExceptione System out println Couldnotlistenonport 4700 System exit 1 退出 while listening 永远循环监听newServerThread serverSocket accept clientnum start 监听到客户请求 根据得到的Socket对象和客户计数创建服务线程 并启动之System out println Client clientnum 1 isconnected clientnum 增加客户计数 serverSocket close 关闭ServerSocket 88 URL通信与Socket通信都是面向连接的通信 它们的区别在于 Socket通信方式为主动等待客户端的服务请求方式 而URL通信方式为被动等待客户端的服务请求方式 利用Socket进行通信时 在服务器端运行了一个Socket通信程序 不停地监听客户端的连接请求 当接到客户端请求后 马上建立连接并进行通信 利用URL进行通信时 在服务器端常驻一个CGI程序 但它一直处于睡眠状态 只有当客户端的连接请求到达时才被唤醒 然后建立连接并进行通信 URL通信与Socket通信的区别 89 在Socket通信方式中 服务器端的程序可以打开多个线程与多个客户端进行通信 并且还可以通过服务器使各个客户端之间进行通信 这种方式适合于一些较复杂的通信 而在URL通信方式中 服务器端的程序只能与一个客户进行通信 这种方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年国内知名企业数据分析师岗位招聘面试题及答案
- 2025年人事专员面试问题及模拟题答案
- 2025年健康照护师专业资格认证考试模拟题及答案
- 2025年旋挖钻机项目建议书
- 2025年口服降血糖药项目建议书
- 2025年生物质气化机组项目建议书
- 抛光粉尘安全知识培训课件
- 抗过敏药课件
- 广西南宁市西乡塘区、江南区2024-2025学年七年级下学期期末检测地理试卷(含答案)
- 2025年电视节目自动播出设备项目建议书
- 青海省图书馆(二期)、美术馆、文化馆弱电智能化系统设计方案
- 黑白装饰画教学课件
- 化工行业的责任关怀化工行业的责任关怀
- 飞机上通用应急设备-安全设备
- 2023-2024学年九年级道德与法治上册 同步备课系列 教学设计教案(全册)
- 保健食品用原料人参叶团体标准
- “高效的课件制作技巧及展示技能培训”
- 小儿支气管肺炎护理查房
- 五年级上册道德与法治总复习资料
- 麻醉科常用操作规范
- 2021年中国肿瘤相关静脉血栓栓塞症的预防与治疗专家共识
评论
0/150
提交评论