java套接字编程.pdf_第1页
java套接字编程.pdf_第2页
java套接字编程.pdf_第3页
java套接字编程.pdf_第4页
java套接字编程.pdf_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA 套接字编程 JAVA 套接字编程 用 Java 开发网络软件非常方便和强大 Java 的这种力量来源于他独有的一套强大的用 于网络的 API 这些 API 是一系列的类和接口 均位于包 和 中 在 这篇文章中我们将介绍套接字 Socket 慨念 同时以实例说明如何使用 Network API 操 纵套接字 在完成本文后 你就可以编写网络低端通讯软件 什么是套接字什么是套接字 Socket Network API 是典型的用于基于 TCP IP 网络 Java 程序与其他程序通讯 Network API 依靠 Socket 进行通讯 Socket 可以看成在两个程序进行通讯连接中的一个端点 一个程序将一段信息写入 Socket 中 该 Socket 将这段信息发送给另外一个 Socket 中 使这段信息能传送到其他程序中 如图 1 我们来分析一下图 1 Host A 上的程序 A 将一段信息写入 Socket 中 Socket 的内 容被 Host A 的网络管理软件访问 并将这段信息通过 Host A 的网络接口卡发送到 Host B Host B 的网络接口卡接收到这段信息后 传送给 Host B 的网络管理软件 网络管 理软件将这段信息保存在 Host B 的 Socket 中 然后程序 B 才能在 Socket 中阅读这段 信息 假设在图 1 的网络中添加第三个主机 Host C 那么 Host A 怎么知道信息被正确传 送到 Host B 而不是被传送到 Host C 中了呢 基于 TCP IP 网络中的每一个主机均被赋 予了一个唯一的 IP 地址 IP 地址是一个 32 位的无符号整数 由于没有转变成二进制 因此通常以小数点分隔 如 198 163 227 6 正如所见 IP 地址均由四个部分组成 每 个部分的范围都是 0 255 以表示 8 位地址 值得注意的是 IP 地址都是 32 位地址 这是 IP 协议版本 4 简称 Ipv4 规定的 目前由于 IPv4 地址已近耗尽 所以 IPv6 地址正逐渐代替 Ipv4 地址 Ipv6 地址则是 128 位无符号整数 假设第二个程序被加入图 1 的网络的 Host B 中 那么由 Host A 传来的信息如何能 被正确的传给程序 B 而不是传给新加入的程序呢 这是因为每一个基于 TCP IP 网络通 讯的程序都被赋予了唯一的端口和端口号 端口是一个信息缓冲区 用于保留 Socket 中的输入 输出信息 端口号是一个 16 位无符号整数 范围是 0 65535 以区别主机上 的每一个程序 端口号就像房屋中的房间号 低于 256 的短口号保留给标准应用程序 比如 pop3 的端口号就是 110 每一个套接字都组合进了 IP 地址 端口 端口号 这样 形成的整体就可以区别每一个套接字 t 下面我们就来谈谈两种套接字 流套接字和自 寻址数据套接字 流套接字 流套接字 Stream Socket 无论何时 在两个网络应用程序之间发送和接收信息时都需要建立一个可靠的连 接 流套接字依靠 TCP 协议来保证信息正确到达目的地 实际上 IP 包有可能在网络 中丢失或者在传送过程中发生错误 任何一种情况发生 作为接受方的 TCP 将联系发 送方 TCP 重新发送这个 IP 包 这就是所谓的在两个流套接字之间建立可靠的连接 流套接字在 C S 程序中扮演一个必需的角色 客户机程序 需要访问某些服务的网 络应用程序 创建一个扮演服务器程序的主机的 IP 地址和服务器程序 为客户端应用 程序提供服务的网络应用程序 的端口号的流套接字对象 客户端流套接字的初始化代码将 IP 地址和端口号传递给客户端主机的网络管理软 件 管理软件将 IP 地址和端口号通过 NIC 传递给服务器端主机 服务器端主机读到经 过 NIC 传递来的数据 然后查看服务器程序是否处于监听状态 这种监听依然是通过套 接字和端口来进行的 如果服务器程序处于监听状态 那么服务器端网络管理软件就向 客户机网络管理软件发出一个积极的响应信号 接收到响应信号后 客户端流套接字初 始化代码就给客户程序建立一个端口号 并将这个端口号传递给服务器程序的套接字 服务器程序将使用这个端口号识别传来的信息是否是属于客户程序 同时完成流套接 字的初始化 如果服务器程序没有处于监听状态 那么服务器端网络管理软件将给客户端传递一 个消极信号 收到这个消极信号后 客户程序的流套接字初始化代码将抛出一个异常对 象并且不建立通讯连接 也不创建流套接字对象 这种情形就像打电话一样 当有人的 时候通讯建立 否则电话将被挂起 这部分的工作包括了相关联的三个类 InetAddress Socket 和 ServerSocket InetAddress 对象描绘了32 位或 128 位IP 地址 Socket 对象代表了客户程序流套接字 ServerSocket 代表了服务程序流套接字 所有这三个类均位于包 中 InetAddress 类类 InetAddress 类在网络 API 套接字编程中扮演了一个重要角色 参数传递给流套接 字类和自寻址套接字类构造器或非构造器方法 InetAddress 描述了 32 位或 64 位 IP 地址 要完成这个功能 InetAddress 类主要依靠两个支持类 Inet4Address 和 Inet6Address 这三个类是继承关系 InetAddrress 是父类 Inet4Address 和 Inet6Address 是子类 由于 InetAddress 类只有一个构造函数 而且不能传递参数 所以不能直接创建 InetAddress 对象 比如下面的做法就是错误的 InetAddress ia new InetAddress 但我们可以通过下面的 5 个工厂方法创建来创建一个 InetAddress 对象或 InetAddress 数组 getAllByName String host 方法返回一个 InetAddress 对象的引用 每个对象包 含一个表示相应主机名的单独的 IP 地址 这个 IP 地址是通过 host 参数传递的 对于 指定的主机如果没有 IP 地址存在那么这个方法将抛出一个 UnknownHostException 异 常对象 getByAddress byte addr 方法返回一个 InetAddress 对象的引用 这个对象 包含了一个 Ipv4 地址或 Ipv6 地址 Ipv4 地址是一个 4 字节数组 Ipv6 地址是一个 16 字节地址数组 如果返回的数组既不是 4 字节的也不是 16 字节的 那么方法将会抛出 一个 UnknownHostException 异常对象 getByAddress String host byte addr 方法返回一个InetAddress对象的引用 这个 InetAddress 对象包含了一个由 host 和 4 字节的 addr 数组指定的 IP 地址 或者是 host 和 16 字节的 addr 数组指定的 IP 地址 如果这个数组既不是 4 字节的也不是 16 位字节的 那么该方法将抛出一个 UnknownHostException 异常对象 getByName String host 方法返回一个 InetAddress 对象 该对象包含了一个与 host 参数指定的主机相对应的 IP 地址 对于指定的主机如果没有 IP 地址存在 那么方 法将抛出一个 UnknownHostException 异常对象 getLocalHost 方法返回一个 InetAddress 对象 这个对象包含了本地机的 IP 地址 考虑到本地主机既是客户程序主机又是服务器程序主机 为避免混乱 我们将客 户程序主机称为客户主机 将服务器程序主机称为服务器主机 上面讲到的方法均提到返回一个或多个 InetAddress 对象的引用 实际上每一个方 法都要返回一个或多个 Inet4Address Inet6Address 对象的引用 调用者不需要知道引 用的子类型 相反调用者可以使用返回的引用调用 InetAddress 对象的非静态方法 包 括子类型的多态以确保重载方法被调用 InetAddress 和它的子类型对象处理主机名到主机 IPv4 或 IPv6 地址的转换 要完 成这个转换需要使用域名系统 下面的代码示范了如何通过调用 getByName String host 方法获得 InetAddress 子类对象的方法 这个对象包含了与 host 参数相对应的 IP 地址 InetAddress ia InetAddress getByName 一但获得了 InetAddress 子类对象的引用就可以调用 InetAddress 的各种方法来获 得 InetAddress 子类对象中的 IP 地址信息 比如 可以通过调用 getCanonicalHostName 从域名服务中获得标准的主机名 getHostAddress 获得 IP 地址 getHostName 获得主机名 isLoopbackAddress 判断 IP 地址是否是一个 loopback 地址 List1 是一段示范代码 InetAddressDemo InetAddressDemo java import class InetAddressDemo public static void main String args throws UnknownHostException String host localhost if args length 1 host args 0 InetAddress ia InetAddress getByName host System out println Canonical Host Name ia getCanonicalHostName System out println Host Address ia getHostAddress System out println Host Name ia getHostName System out println Is Loopback Address ia isLoopbackAddress 当无命令行参数时 代码输出类似下面的结果 Canonical Host Name localhost Host Address 127 0 0 1 Host Name localhost Is Loopback Address true InetAddressDemo 给了你一个指定主机名作为命令行参数的选择 如果没有主机名 被 指 定 那 么 将 使 用localhost 客 户 机 的 InetAddressDemo通 过 调 用 getByName String host 方法获得一个 InetAddress 子类对象的引用 通过这个引用获 得了标准主机名 主机地址 主机名以及 IP 地址是否是 loopback 地址的输出 Socket 类类 当客户程序需要与服务器程序通讯的时候 客户程序在客户机创建一个 socket 对 象 Socket 类有几个构造函数 两个常用的构造函数是 Socket InetAddress addr int port 和 Socket String host int port 两个构造函数都创建了一个基于 Socket 的连接 服务器端流套接字的流套接字 对于第一个 InetAddress 子类对象通过 addr 参数获得 服务器主机的 IP 地址 对于第二个函数 host 参数包被分配到 InetAddress 对象中 如 果没有 IP 地址与 host 参数相一致 那么将抛出 UnknownHostException 异常对象 两 个函数都通过参数 port 获得服务器的端口号 假设已经建立连接了 网络 API 将在客 户端基于 Socket 的流套接字中捆绑客户程序的 IP 地址和任意一个端口号 否则两个函 数都会抛出一个 IOException 对象 如果创建了一个 Socket 对象 那么它可能通过调用 Socket 的 getInputStream 方法从服务程序获得输入流读传送来的信息 也可能通过调用 Socket 的 getOutputStream 方法获得输出流来发送消息 在读写活动完成之后 客户程序调用 close 方法关闭流和流套接字 下面的代码创建了一个服务程序主机地址为 198 163 227 6 端口号为 13 的 Socket 对象 然后从这个新创建的 Socket 对象中读取 输入流 然后再关闭流和 Socket 对象 Socket s new Socket 198 163 227 6 13 InputStream is s getInputStream Read from the stream is close s close 接下面我们将示范一个流套接字的客户程序 这个程序将创建一个 Socket 对象 Socket 将访问运行在指定主机端口 10000 上的服务程序 如果访问成功客户程序将给 服务程序发送一系列命令并打印服务程序的响应 List2 使我们创建的程序 SSClient 的 源代码 Listing 2 SSClient java SSClient java import java io import class SSClient public static void main String args String host localhost If user specifies a command line argument that argument represents the host name if args length 1 host args 0 BufferedReader br null PrintWriter pw null Socket s null try Create a socket that attempts to connect to the server program on the host at port 10000 s new Socket host 10000 Create an input stream reader that chains to the socket s byte oriented input stream The input stream reader converts bytes read from the socket to characters The conversion is based on the platform s default character set InputStreamReader isr isr new InputStreamReader s getInputStream Create a buffered reader that chains to the input stream reader The buffered reader supplies a convenient method for reading entire lines of text br new BufferedReader isr Create a print writer that chains to the socket s byte oriented output stream The print writer creates an intermediate output stream writer that converts characters sent to the socket to bytes The conversion is based on the platform s default character set pw new PrintWriter s getOutputStream true Send the DATE command to the server pw println DATE Obtain and print the current date time System out println br readLine Send the PAUSE command to the server This allows several clients to start and verifies that the server is spawning multiple threads pw println PAUSE Send the DOW command to the server pw println DOW Obtain and print the current day of week System out println br readLine Send the DOM command to the server pw println DOM Obtain and print the current day of month System out println br readLine Send the DOY command to the server pw println DOY Obtain and print the current day of year System out println br readLine catch IOException e System out println e toString finally try if br null br close if pw null pw close if s null s close catch IOException e 运行这段程序将会得到下面的结果 Tue Jan 29 18 11 51 CST 2002 TUESDAY 29 29 SSClient 创建了一个 Socket 对象与运行在主机端口 10000 的服务程序联系 主机 的 IP 地址由 host 变量确定 SSClient 将获得 Socket 的输入输出流 围绕 BufferedReader 的输入流和 PrintWriter 的输出流对字符串进行读写操作就变得非常容 易 SSClient 个服务程序发出各种 date time 命令并得到响应 每个响应均被打印 一 旦最后一个响应被打印 将执行 Try Catch Finally 结构的 Finally 子串 Finally 子串将 在关闭 Socket 之前关闭 BufferedReader 和 PrintWriter 在 SSClient 源代码编译完成后 可以输入 java SSClient 来执行这段程序 如果有 合适的程序运行在不同的主机上 采用主机名 IP 地址为参数的输入方式 比如 是运行服务器程序的主机 那么输入方式就是 java SSClient 技巧技巧 Socket 类包含了许多有用的方法 比如 getLocalAddress 将返回一个包含客户程 序 IP 地址的 InetAddress 子类对象的引用 getLocalPort 将返回客户程序的端口 号 getInetAddress 将返回一个包含服务器 IP 地址的 InetAddress 子类对象的引用 getPort 将返回服务程序的端口号 ServerSocket 类类 由于 SSClient 使用了流套接字 所以服务程序也要使用流套接字 这就要创建一 个 ServerSocket 对象 ServerSocket 有几个构造函数 最简单的是 ServerSocket int port 当使用 ServerSocket int port 创建一个 ServerSocket 对象 port 参数传递端口 号 这个端口就是服务器监听连接请求的端口 如果在这时出现错误将抛出 IOException 异常对象 否则将创建 ServerSocket 对象并开始准备接收连接请求 接下来服务程序进入无限循环之中 无限循环从调用 ServerSocket 的 accept 方 法开始 在调用开始后 accept 方法将导致调用线程阻塞直到连接建立 在建立连接后 accept 返回一个最近创建的 Socket 对象 该 Socket 对象绑定了客户程序的 IP 地址或 端口号 由于存在单个服务程序与多个客户程序通讯的可能 所以服务程序响应客户程序不 应该花很多时间 否则客户程序在得到服务前有可能花很多时间来等待通讯的建立 然 而服务程序和客户程序的会话有可能是很长的 这与电话类似 因此为加快对客户程 序连接请求的响应 典型的方法是服务器主机运行一个后台线程 这个后台线程处理服 务程序和客户程序的通讯 为了示范我们在上面谈到的慨念并完成 SSClient 程序 下面我们创建一个 SSServer 程序 程序将创建一个 ServerSocket 对象来监听端口 10000 的连接请求 如果成功服务程序将等待连接输入 开始一个线程处理连接 并响应来自客户程序的命 令 下面就是这段程序的代码 Listing 3 SSServer java SSServer java import java io import import java util class SSServer public static void main String args throws IOException System out println Server starting n Create a server socket that listens for incoming connection requests on port 10000 ServerSocket server new ServerSocket 10000 while true Listen for incoming connection requests from client programs establish a connection and return a Socket object that represents this connection Socket s server accept System out println Accepting Connection n Start a thread to handle the connection new ServerThread s start class ServerThread extends Thread private Socket s ServerThread Socket s this s s public void run BufferedReader br null PrintWriter pw null try Create an input stream reader that chains to the socket s byte oriented input stream The input stream reader converts bytes read from the socket to characters The conversion is based on the platform s default character set InputStreamReader isr isr new InputStreamReader s getInputStream Create a buffered reader that chains to the input stream reader The buffered reader supplies a convenient method for reading entire lines of text br new BufferedReader isr Create a print writer that chains to the socket s byte oriented output stream The print writer creates an intermediate output stream writer that converts characters sent to the socket to bytes The conversion is based on the platform s default character set pw new PrintWriter s getOutputStream true Create a calendar that makes it possible to obtain date and time information Calendar c Calendar getInstance Because the client program may send multiple commands a loop is required Keep looping until the client either explicitly requests termination by sending a command beginning with letters BYE or implicitly requests termination by closing its output stream do Obtain the client program s next command String cmd br readLine Exit if client program has closed its output stream if cmd null break Convert command to uppercase for ease of comparison cmd cmd toUpperCase If client program sends BYE command terminate if cmd startsWith BYE break If client program sends DATE or TIME command return current date time to the client program if cmd startsWith DATE cmd startsWith TIME pw println c getTime toString If client program sends DOM Day Of Month command return current day of month to the client program if cmd startsWith DOM pw println c get Calendar DAY OF MONTH If client program sends DOW Day Of Week command return current weekday as a string to the client program if cmd startsWith DOW switch c get Calendar DAY OF WEEK case Calendar SUNDAY pw println SUNDAY break case Calendar MONDAY pw println MONDAY break case Calendar TUESDAY pw println TUESDAY break case Calendar WEDNESDAY pw println WEDNESDAY break case Calendar THURSDAY pw println THURSDAY break case Calendar FRIDAY pw println FRIDAY break case Calendar SATURDAY pw println SATURDAY If client program sends DOY Day of Year command return current day of year to the client program if cmd startsWith DOY pw println c get Calendar DAY OF YEAR If client program sends PAUSE command sleep for three seconds if cmd startsWith PAUSE try Thread sleep 3000 catch InterruptedException e while true catch IOException e System out println e toString finally System out println Closing Connection n try if br null br close if pw null pw close if s null s close catch IOException e 运行这段程序将得到下面的输出 Server starting Accepting Connection Closing Connection SSServer的源代码声明了一对类 SSServer 和ServerThread SSServer的main 方法创建了一个 ServerSocket 对象来监听端口 10000 上的连接请求 如果成功 SSServer 进入一个无限循环中 交替调用 ServerSocket 的 accept 方法来等待连接 请求 同时启动后台线程处理连接 accept 返回的请求 线程由 ServerThread 继承 的 start 方法开始 并执行 ServerThread 的 run 方法中的代码 一旦 run 方法运行 线程将创建 BufferedReader PrintWriter 和 Calendar 对象并 进入一个循环 这个循环由读 通过 BufferedReader 的 readLine 来自客户程序的 一行文本开始 文本 命令 存储在 cmd 引用的 string 对象中 如果客户程序过早的 关闭输出流 会发生什么呢 答案是 cmd 将得不到赋值 注意必须考虑到这种情况 在服务程序正在读输入流时 客户程序关闭了输出流 如果没有对这种情况进行处理 那么程序将产生异常 一旦编译了 SSServer 的源代码 通过输入 Java SSServer 来运行程序 在开始运 行 SSServer 后 就可以运行一个或多个 SSClient 程序 自寻址套接字 自寻址套接字 Datagram Sockets 因为使用流套接字的每个连接均要花费一定的时间 要减少这种开销 网络 API 提供了第二种套接字 自寻址套接字 datagram socket 自寻址使用 UDP 发送寻址 信息 从客户程序到服务程序或从服务程序到客户程序 不同的是可以通过自寻址套 接字发送多 IP 信息包 自寻址信息包含在自寻址包中 此外自寻址包又包含在 IP 包内 这就将寻址信息长度限制在 60000 字节内 图 2 显示了位于 IP 包内的自寻址包的自寻 址信息 与 TCP 保证信息到达信息目的地的方式不同 UDP 提供了另外一种方法 如果自 寻址信息包没有到达目的地 那么 UDP 也不会请求发送者重新发送自寻址包 这是 因为 UDP 在每一个自寻址包中包含了错误检测信息 在每个自寻址包到达目的地之后 UDP 只进行简单的错误检查 如果检测失败 UDP 将抛弃这个自寻址包 也不会从发 送者那里重新请求替代者 这与通过邮局发送信件相似 发信人在发信之前不需要与收 信人建立连接 同样也不能保证信件能到达收信人那里 自寻址套接字工作包括下面三个类 DatagramPacket DatagramSocket 和 MulticastSocket DatagramPacket 对象描绘了自寻址包的地址信息 DatagramSocket 表示客户程序和服务程序自寻址套接字 MulticastSocket 描绘了能进行多点传送的自寻 址套接字 这三个类均位于 包内 DatagramPacket 类类 在使用自寻址包之前 你需要首先熟悉 DatagramPacket 类 地址信息和自寻址包 以字节数组的方式同时压缩入这个类创建的对象中 DatagramPacket 有数个构造函数 即使这些构造函数的形式不同 但通常情况下 他们都有两个共同的参数 byte buffer 和 int length buffer 参数包含了一个对保存 自寻址数据包信息的字节数组的引用 length 表示字节数组的长度 最简单的构造函数是 DatagramPacket byte buffer int length 这个构造函数确 定了自寻址数据包数组和数组的长度 但没有任何自寻址数据包的地址和端口信息 这 些信息可以后面通过调用方法 setAddress InetAddress addr 和 setPort int port 添加 上 下面的代码示范了这些函数和方法 byte buffer new byte 100 DatagramPacket dgp new DatagramPacket buffer buffer length InetAddress ia InetAddress getByName dgp setAddress ia dgp setPort 6000 Send datagram packet to port 6000 如果你更喜欢在调用构造函数的时候同时包括地址和端口号 可以使用 DatagramPacket byte buffer int length InetAddress addr int port 函数 下面的代码 示范了另外一种选择 byte buffer new byte 100 InetAddress ia InetAddress getByName DatagramPacket dgp new DatagramPacket buffer buffer length ia 6000 有时候在创建了 DatagramPacket 对象后想改变字节数组和他的长度 这时可以通 过调用 setData byte buffer 和 setLength int length 方法来实现 在任何时候都可以 通过调用 getData 来得到字节数组的引用 通过调用 getLength 来获得字节数组的 长度 下面的代码示范了这些方法 byte buffer2 new byte 256 dgp setData buffer2 dgp setLength buffer2 length 关于 DatagramPacket 的更多信息请参考 SDK 文档 DatagramSocket 类类 DatagramSocket 类在客户端创建自寻址套接字与服务器端进行通信连接 并发送 和接受自寻址套接字 虽然有多个构造函数可供选择 但我发现创建客户端自寻址套接 字最便利的选择是 DatagramSocket 函数 而服务器端则是 DatagramSocket int port 函数 如果未能创建自寻址套接字或绑定自寻址套接字到本地端口 那么这两个函数都 将抛出一个 SocketException 对象 一旦程序创建了 DatagramSocket 对象 那么程序 分别调用 send DatagramPacket dgp 和 receive DatagramPacket dgp 来发送和接收 自寻址数据包 List4 显示的 DGSClient 源代码示范了如何创建自寻址套接字以及如何通过套接字 处理发送和接收信息 Listing 4 DGSClient java DGSClient java import java io import class DGSClient public static void main String args String host localhost If user specifies a command line argument that argument represents the host name if args length 1 host args 0 DatagramSocket s null try Create a datagram socket bound to an arbitrary port s new DatagramSocket Create a byte array that will hold the data portion of a datagram packet s message That message originates as a String object which gets converted to a sequence of bytes when String s getBytes method is called The conversion uses the platform s default character set byte buffer buffer new String Send me a datagram getBytes Convert the name of the host to an InetAddress object That object contains the IP address of the host and is used by DatagramPacket InetAddress ia InetAddress getByName host Create a DatagramPacket object that encapsulates a reference to the byte array and destination address information The destination address consists of the host s IP address as stored in the InetAddress object and port number 10000 the port on which the server program listens DatagramPacket dgp new DatagramPacket buffer buffer length ia 10000 Send the datagram packet over the socket s send dgp Create a byte array to hold the response from the server program byte buffer2 new byte 100 Create a DatagramPacket object that specifies a buffer to hold the server program s response the IP address of the server program s computer and port number 10000 dgp new DatagramPacket buffer2 buffer length ia 10000 Receive a datagram packet over the socket s receive dgp Print the data returned from the server program and stored in the datagram packet System out println new String dgp getData catch IOException e System out println e toString finally if s null s close DGSClient 由创建一个绑定任意本地 客户端 端口好的 DatagramSocket 对象开 始 然后装入带有文本信息的数组 buffer 和描述服务器主机 IP 地址的 InetAddress 子 类对象的引用 接下来 DGSClient 创建了一个 DatagramPacket 对象 该对象加入了 带文本信息的缓冲器的引用 InetAddress 子类对象的引用 以及服务端口号 10000 DatagramPacket 的自寻址数据包通过方法 sent 发送给服务器程序 于是一个包含服 务程序响应的新的 DatagramPacket 对象被创建 receive 得到响应的自寻址数据包 然后自寻址数据包的 getData 方法返回该自寻址数据包的一个引用 最后关闭 DatagramSocket DGSServer 服务程序补充了 DGSClient 的不足 List5 是 DGSServer 的源代码 Listing 5 DGSServer java DGSServer java import java io import class DGSServer public static void main String args throws IOException System out println Server starting n Create a datagram socket bound to port 10000 Datagram packets sent from client programs arrive at this port DatagramSocket s new DatagramSocket 10000 Create a byte array to hold data contents of datagram packet byte data new byte 100 Create a DatagramPacket object that encapsulates a reference to the byte array and destination address information The DatagramPacket object is not initialized to an address because it obtains that address from the client program DatagramPacket dgp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论