版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十三章 Java网络编程一、Java套接字实现网络编程之基础篇 1用 Java 开发网络软件非常方便和强大,Java 的这种力量来源于他独有的一套强大的用于 网络的 API,这些 API 是一系列的类和接口,均位于包 和 中。在这篇文 章中我们将介绍套接字(Socket)慨念,同时以实例说明如何使 用 Network API 操纵套接字, 在完成本文后,你将具备编写网络低端通讯软件的能力。1、什么是套接字(Socket)?Network API 是典型的用于基于 TCP/IP 网络 Java 程序与其他程序通讯,Network API 依靠 Socket
2、 进行通讯。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 才能在
3、Socket 中阅读这段信息。假设在图 1 的网络中添加第三个主机 Host C,那么 Host A 怎么知道信息被正确传送到Host B 而不是被传送到 Host C 中了呢?基于 TCP/IP 网络中的每一个主机均被赋予了一个唯 一的 IP 地址,IP 地址是一个 32 位的无符号整数,由于没有转变成二进制,因此通常以小数点分隔,如:,正如所见 IP 地址均由四个部分组成,每个部分的范围都是 0-255, 以表示 8 位地址。值得注意的是 IP 地址都是 32 位地址,这是 IP 协议版本 4(简称 Ipv4)规定的,目前由于 IPv4 地址已近耗尽,所以 IPv
4、6 地址正逐渐代替 Ipv4 地址,Ipv6 地址则是 128 位无符号 整数。假设第二个程序被加入图 1 的网络的 Host B 中,那么由 Host A 传来的信息如何能被正确 的传给程序 B 而不是传给新加入的程序呢?这是因为每一个基于 TCP/IP 网络通讯的程序都被 赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留 Socket 中的输入/输出信息, 端口号是一个 16 位无符号整数,范围是 0-65535,以区别主机上的每一个程序(端口号就像 房屋中的房间号),低于 256 的短口号保留给标准应用程序,比如 pop3 的端口号就是 110, 每一个套接字都组合进了 IP 地
5、址、端口、端口号,这样形成的整体就可以区别每一个套接字 t, 下面我们就来谈谈两种套接字:流套接字和自寻址数据套接字。2、流套接字(Stream Socket) 无论何时,在两个网络应用程序之间发送和接收信息时都需要建立一个可靠的连接,流套接字依靠 TCP 协议来保证信息正确到达目的地,实际上,IP 包有可能在网络中丢失或者在传送过程中发生错误,任何一种情况发生,作为接受方的 TCP 将联系发送方 TCP 重新发送这个 IP包。这就是所谓的在两个流套接字之间建立可靠的连接。流套接字在 C/S 程序中扮演一个必需的角色,客户机程序(需要访问某些服务的网络应用 程序)创建一个扮演服务器程序的主机的
6、 IP 地址和服务器程序(为客户端应用程序提供服务的 网络应用程序)的端口号的流套接字对象。客户端流套接字的初始化代码将 IP 地址和端口号传递给客户端主机的网络管理软件,管理 软件将 IP 地址和端口号通过 NIC 传递给服务器端主机;服务器端主机读到经过 NIC 传递来的 数据,然后查看服务器程序是否处于监听状态,这种监听依然是通过套接字和端口来进行的;如 果服务器程序处于监听状态,那么服务器端网络管理软件就向客户机网络管理软件发出一个积极 的响应信号,接收到响应信号后,客户端流套接字初始化代码就给客户程序建立一个端口号,并 将这个端口号传递给服务器程序的套接字(服务器程序将使用这个端口号
7、识别传来的信息是否是 属于客户程序)同时完成流套接字的初始化。如果服务器程序没有处于监听状态,那么服务器端网络管理软件将给客户端传递一个消极 信号,收到这个消极信号后,客户程序的流套接字初始化代码将抛出一个异常对象并且不建立通 讯连接,也不创建流套接字对象。这种情形就像打电话一样,当有人的时候通讯建立,否则电话 将被挂起。这部分的工作包括了相关联的三个类:InetAddress, Socket, 和 ServerSocket。 InetAddress 对象描绘了 32 位或 128 位 IP 地 址,Socket 对象代表了客户程序流套接字,ServerSocket 代表了服务程序流套接字,所
8、有这 三个类均位于包 中。3、InetAddress 类InetAddress 类在网络 API 套接字编程中扮演了一个重要角色。参数传递给流套接字类和 自寻址套接字类构造器或非构造器方法。 InetAddress 描述了 32 位或 64 位 IP 地址,要完成 这个功能,InetAddress 类主要依靠两个支持类 Inet4Address 和 Inet6Address,这三个 类是继承关系,InetAddrress 是父类,Inet4Address 和 Inet6Address 是子类。2由于 InetAddress 类只有一个构造函数,而且不能传递参数,所以不能直接创
9、建InetAddress 对象,比如下面的做法就是错误的:InetAddress ia = new InetAddress ();但我们可以通过下面的 5 个工厂方法创建来创建一个 InetAddress 对象或 InetAddress 数组:. getAllByName(String host)方法返回一个 InetAddress 对象的引用,每个对象包含一个 表示相应主机名的单独的 IP 地址,这个 IP 地址是通过 host 参数传递的,对于指定的主机如果 没有 IP 地址存在那么这个方法将抛出一个 UnknownHostException 异常对象。. getByAddress(byt
10、e addr)方法返回一个 InetAddress 对象的引用,这个对象包含了 一个 Ipv4 地址或 Ipv6 地址,Ipv4 地址是一个 4 字节数组,Ipv6 地址是一个 16 字节地址数 组,如果返回的数组既不是 4 字节的也不是 16 字节的,那么方法将会抛出一个 UnknownHostException 异常对象。. getByAddress(String host, byte addr)方法返回一个 InetAddress 对象的引用,这个 InetAddress 对象包含了一个由 host 和 4 字节的 addr 数组指定的 IP 地址,或者是 host和 16 字节的 ad
11、dr 数组指定的 IP 地址,如果这 个数组既不是 4 字节的也不是 16 位字节的, 那么该方法将抛出一个 UnknownHostException 异常对象。. getByName(String host)方法返回一个 InetAddress 对象,该对象包含了一个与 host参数指定的主机相对应的 IP 地址,对于指定的主机如果没有 IP 地址存在,那么方法将抛出一个 UnknownHostException 异常对象。. getLocalHost()方法返回一个 InetAddress 对象,这个对象包含了本地机的 IP 地址,考 虑到本地主机既是客户程序主机又是服务器程序主机,为避免
12、混乱,我们将客户程序主机称为客 户主机,将服务器程序主机称为服务器主机。上面讲到的方法均提到返回一个或多个 InetAddress 对象的引用,实际上每一个方法都要 返回一个或多个 Inet4Address/Inet6Address 对象的引用,调用者不需要知道引用的子类型, 相反调用者可以使用返回的引用调用 InetAddress 对象的非静态方法,包括子类型的多态以确 保重载方法被调用。InetAddress 和它的子类型对象处理主机名到主机 IPv4 或 IPv6 地址的转换,要完成这个 转换需要使用域名系统,下面的代码示范了如何通过调用 getByName(String host)方法
13、获得 InetAddress 子类对象的方法,这个对象包含了与 host 参数相对应的 IP 地址:InetAddress ia = InetAddress.getByName ();一但获得了 InetAddress 子类对象的引用就可以调用 InetAddress 的各种方法来获得InetAddress 子类对象中的 IP 地址信 息,比如,可以通过调用 getCanonicalHostName() 从域名服务中获得标准的主机名;getHostAddress()获得 IP 地址, getHostName()获得主 机名,isLoopbackAddress()
14、判断 IP 地址是否是一个 loopback 地址。List1 是一段示范代码:InetAddressDemo3/ InetAddressDemo.javaimport .*;class InetAddressDemopublic static void main (String args) throws UnknownHostExceptionString host = localhost;if (args.length = 1)host = args 0;InetAddress ia = InetAddress.getByName (host);System.out.pri
15、ntln (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 = localhostHost Address = 127
16、.0.0.1Host Name = localhostIs Loopback Address = trueInetAddressDemo 给了你一个指定主机名作为命令行参数的选择,如果没有主机名被指定,那么将使用 localhost(客户机的), InetAddressDemo 通过调用 getByName(String host) 方法获得一个 InetAddress 子类对象的引用,通过这个引用 获得了标准主机名,主机地址, 主机名以及 IP 地址是否是 loopback 地址的输出。4、Socket 类当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个 socket 对象,S
17、ocket 类有几个构造函数。两个常用的构造函数是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),两个构造函数 都创建了一个基于 Socket 的连接服务器端流套接字的流套接字。对于第一个 InetAddress 子 类对象通过 addr 参数获得服务器主机的 IP 地址,对于第二个函数 host 参数包被分配到 InetAddress 对象中,如果没有 IP 地址与 host 参数相一致,那么将抛出 UnknownHostException 异常对象。两个函数都通过参数 port 获得服务器的端口号。假设
18、已 经建立连接了,网络 API 将在客户端基于 Socket 的流套接字中捆绑客户程序的 IP 地址和任意 一个端口号,否则两个函数都会抛出一个 IOException 对象。4如果创建了一个 Socket 对象,那么它可能通过调用 Socket 的 getInputStream()方法 从服务程序获得输入流读传送来的信息,也可能通过调用 Socket 的 getOutputStream()方法 获得输出流来发送消息。在读写活动完成之后,客户程序调用 close()方法关闭流和流套接字, 下面的代码创建了一个服务程序主机地址为 ,端口号为 13 的 Socket 对象
19、, 然后从这个新创建的 Socket 对象中读取输入流,然后再关闭流和 Socket 对象。Socket s = new Socket (, 13);InputStream is = s.getInputStream ();/ Read from the stream.is.close ();s.close ();接下面我们将示范一个流套接字的客户程序,这个程序将创建一个 Socket 对象,Socket将访问运行在指定主机端口 10000 上的服务程序,如果访问成功客户程序将给服务程序发送一 系列命令并打印服务程序的响应。List2 是我们创建的程序 SSClien
20、t 的源代码:Listing 2: SSClient.java/ SSClient.javaimport java.io.*;import .*;class SSClientpublic 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;
21、PrintWriter pw = null;Socket s = null;5try/ 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 sockets/ byte-oriented input stream. The input stream reader/ converts bytes read from
22、 the socket to characters. The/ conversion is based on the platforms 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
23、lines of text.br = new BufferedReader (isr);/ Create a print writer that chains to the sockets 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 platforms default charac
24、ter set.pw = new PrintWriter (s.getOutputStream (), true);6/ 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
25、 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.
26、readLine ();/ Send the DOY command to the server.pw.println (DOY);/ Obtain and print the current day of year.System.out.println (br.readLine ();7运行这段程序将会得到下面的结果:Tue Jan 29 18:11:51 CST 2002TUESDAY2929SSClient 创建了一个 Socket 对象与运行在主机端口 10000 的服务程序联系,主机的 IP地址由 host 变量确定。SSClient 将获得 Socket 的输入输出流,围绕 Buf
27、feredReader 的输 入流和 PrintWriter 的输出流对字符串进行读写操作就变得非常容易,SSClient 向服务程序发 出各种 date/time 命令并得到响应,每个响应均被打印,一旦最后一个响应被打印,将执行 Try/Catch/Finally 结构的 Finally 子串,Finally 子串将在关闭 Socket 之前关闭 BufferedReader 和 PrintWriter。在 SSClient 源代码编译完成后,可以输入 java SSClient 来执行这段程序,如果有合适 的程序运行在不同的主机上,采用主机名/IP 地址 为参数的输入方式,比如 www.s
28、 是运行服务器程序的主机,那么输入方式就是 java SSClient 。二、Java套接字实现网络编程之基础篇 21、技巧Socket 类包含了许多有用的方法。比如 getLocalAddress()将返回一个包含客户程序 IP 地址的 InetAddress 子类对象的引用;getLocalPort()将返回客户程序的端口 号;getInetAddress()将返回一个包含服务器 IP 地址的 InetAddress 子类对象的引用; getPort()将返回服务程序的端口号。2、ServerSocket 类由于 SSClient 使用了流
29、套接字,所以服务程序也要使用流套接字。这就要创建一个 ServerSocket 对象,ServerSocket 有几个构造函数,最简单的是 ServerSocket(int port), 当使用 ServerSocket (int port)创建一个 ServerSocket 对象,port 参数传递端口号,这个 端口就是服务器监听连接请求的端口,如果在这时出现错误将抛出 IOException 异常对象,否 则将创建 ServerSocket 对象并开始准备接收连接请求。接下来服务程序进入无限循环之中,无限循环从调用 ServerSocket 的 accept()方法开始, 在调用开始后 a
30、ccept()方法将导致调用线程阻塞直到连接建立。在建立连接后 accept()返回一 个最近创建的 Socket 对象,该 Socket 对象绑定了客户程序的 IP 地址或端口号。由于存在单个服务程序与多个客户程序通讯的可能,所以服务程序响应客户程序不应该花 很多时间,否则客户程序在得到服务前有可能花很多时间来等待通讯的建立,然而服务程序和客 户程序的会话有可能是很长的(这与电话类似),因此为加快对客户程序连接请求的响应,典型 的方法是服务器主机运行一个后台线程,这个后台线程处理服务程序和客户程序的通讯。9为了示范我们在上面谈到的慨念并完成 SSClient 程序,下面我们创建一个 SSSe
31、rver 程序, 程序将创建一个 ServerSocket 对象来监听端口 10000 的连接请求,如果成功服务程序将等待 连接输入,开始一个线程处理连接,并响应来自客户程序的命令。下面就是这段程序的代码:Listing 3: SSServer.java/ SSServer.javaimport java.io.*;import .*;import java.util.*;class SSServerpublic static void main (String args) throws IOExceptionSystem.out.println (Server startin
32、g.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.S
33、ocket s = server.accept ();System.out.println (Accepting Connection.n);/ Start a thread to handle the connection.new ServerThread (s).start ();10class ServerThread extends Threadprivate Socket s;ServerThread (Socket s)this.s = s; public void run ()BufferedReader br = null;PrintWriter pw = null;try/
34、Create an input stream reader that chains to the sockets/ byte-oriented input stream. The input stream reader/ converts bytes read from the socket to characters. The/ conversion is based on the platforms default character/ set.InputStreamReader isr;isr = new InputStreamReader (s.getInputStream ();/
35、Create a buffered reader that chains to the input stream/ reader. The buffered reader supplies a convenient method/ for reading entire lines of text.11br = new BufferedReader (isr);/ Create a print writer that chains to the sockets byte-/ oriented output stream. The print writer creates an/ intermed
36、iate output stream writer that converts/ characters sent to the socket to bytes. The conversion/ is based on the platforms 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.get
37、Instance ();/ 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 prog
38、rams next command.String cmd = br.readLine ();/ Exit if client program has closed its output stream.if (cmd = null)break;12/ 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 progra
39、m 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.prin
40、tln ( + 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 (MOND
41、AY);13break;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
42、 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)tryThread.sleep (3000);14catch (InterruptedException e)while (true);cat
43、ch (IOException e)System.out.println (e.toString ();finallySystem.out.println (Closing Connection.n);tryif (br != null)br.close ();if (pw != null)pw.close ();if (s != null)s.close ();15运行这段程序将得到下面的输出:Server starting.Accepting Connection.Closing Connection.SSServer 的源代码声明了一对类:SSServer 和 ServerThread;
44、SSServer 的 main()方法创建了一个 ServerSocket 对象来监听端口 10000 上的连接请求,如果成功, SSServer 进入一个无限循环中,交替调用 ServerSocket 的 accept() 方法来等待连接请求,同时启动 后台线程处理连接(accept()返回的请求)。线程由 ServerThread 继承的 start ()方法开始, 并执行 ServerThread 的 run()方法中的代码。一旦 run()方法运行,线程将创建 BufferedReader, PrintWriter 和 Calendar 对象并进 入一个循环,这个循环由读(通过 Buf
45、feredReader 的 readLine())来自客户程序的一行文本 开始,文本(命令)存储在 cmd 引用的 string 对象中,如果客户程序过早的关闭输出流,会发 生什么呢?答案是:cmd 将得不到赋值。注意必须考虑到这种情况:在服务程序正在读输入流时,客户程序关闭了输出流,如果没 有对这种情况进行处理,那么程序将产生异常。一旦编译了 SSServer 的源代码,通过输入 Java SSServer 来运行程序,在开始运行SSServer 后,就可以运行一个或多个 SSClient 程序。三、Java网络编程精解之ServerSocket用法详解一 1在客户/服务器通信模式中,服务器
46、端需要创建监听特定端口的 ServerSocket, ServerSocket 负责接收客户连接请求。本章首先介绍 ServerSocket 类的各个构造方法,以 及成员方法的用法,接着介绍服务器如何用多线程来处理与多个客户的通信任务。16本章提供线程池的一种实现方式。线程池包括一个工作队列和若干工作线程。服务器程序 向工作队列中加入与客户通信的任务,工作线程不断从工作队列中取出任务并执行它。本章还介 绍了 java.util.concurrent 包中的线程池类的用法,在服务器程序中可以直接使用它们。3.1 构造 ServerSocketServerSocket 的构造方法有以下几种重载形式
47、:ServerSocket()throws IOExceptionServerSocket(int port) throws IOExceptionServerSocket(int port, int backlog) throws IOExceptionServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException在以上构造方法中,参数 port 指定服务器要绑定的端口(服务器要监听的端口),参数backlog 指定客户连接请求队列的长度,参数 bindAddr 指定服务器要绑定的 IP 地址。3.1.
48、1 绑定端口 除了第一个不带参数的构造方法以外,其他构造方法都会使服务器与特定端口绑定,该端口由参数 port 指定。例如,以下代码创建了一个与 80 端口绑定的服务器:ServerSocket serverSocket=new ServerSocket(80);如果运行时无法绑定到 80 端口,以上代码会抛出 IOException,更确切地说,是抛出BindException,它是 IOException 的子类。BindException 一般是由以下原因造成的:端口已经被其他服务器进程占用;在某些操作系统中,如果没有以超级用户的身份来运行服务器程序,那么操作系统不允许服务 器绑定到 1
49、1023 之间的端口。如果把参数 port 设为 0,表示由操作系统来为服务器分配一个任意可用的端口。由操作系 统分配的端口也称为匿名端口。对于多数服务器,会使用明确的端口,而不会使用匿名端口,因 为客户程序需要事先知道服务器的端口,才能方便地访问服务器。在某些场合,匿名端口有着特 殊的用途。3.1.2 设定客户连接请求队列的长度 当服务器进程运行时,可能会同时监听到多个客户的连接请求。例如,每当一个客户进程执行以下代码:Socket socket=new Socket(,80);就意味着在远程主机的 80 端口上,监
50、听到了一个客户的连接请求。管理客户连接请求的任务是由操作系统来完成的。操作系统把这些连接请求存储在一个先进先出 的队列中。许多操作系统限定了队列的最大长度,一般为 50。当队列中的连接请求达到了队列 的最大容量时,服务器进程所在的主机会拒绝新的连接请求。只有当服务器进程通过17ServerSocket的accept()方法从队列中取出连接请求,使队列腾出空位时,队列才能继续加入 新的连接请求。对于客户进程,如果它发出的连接请求被加入到服务器的队列中,就意味着客户与服务器 的连接建立成功,客户进程从 Socket 构造方法中正常返回。如果客户进程发出的连接请求被服 务器拒绝,Socket 构造方
51、法就会抛出 ConnectionException。ServerSocket 构造方法的 backlog 参数用来显式设置连接请求队列的长度,它将覆盖操 作系统限定的队列的最大长度。值得注意的是,在以下几种情况中,仍然会采用操作系统限定的 队列的最大长度:backlog 参数的值大于操作系统限定的队列的最大长度;backlog 参数的值小于或等于 0;在 ServerSocket 构造方法中没有设置 backlog 参数。以下例程 3-1 的 Client.java 和例程 3-2 的 Server.java 用来演示服务器的连接请求队列 的特性。例程 3-1 Client.javaimpor
52、t .*;public class Client public static void main(String args)throws Exceptionfinal int length=100;String host=localhost;int port=8000;Socket sockets=new Socketlength;for(int i=0;isocketsi=new Socket(host, port);System.out.println(第+(i+1)+次连接成功);Thread.sleep(3000);for(int i=0;isocketsi.close(
53、);/断开连接18例程 3-2 Server.javaimport java.io.*;import .*;public class Server private int port=8000;private ServerSocket serverSocket;public Server() throws IOException serverSocket = new ServerSocket(port,3);/连接请求队列的长度为 3System.out.println(服务器启动);public void service() while (true) Socket socket=null;try socket = serverSocket.accept();/从连接请求队列中取出一个连接System.out.println(New connection accepted +socket.getInetAddress() + : +socket.getPort();catch (IOException e) e.printStackTrace();finally tryif(socket!=null)socket.close(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度仓储物流仓单质押信用担保合作协议范本3篇
- 2025年度智能交通系统建设项目承包协议书模板4篇
- 2024版规范化技术服务协议样本版
- 2025年度砖厂节能减排技术承包合同4篇
- 2025年度智能标识技术采购合同范本汇编3篇
- 2025年棕榈油项目可行性研究报告
- 《高频波机培训教材》课件
- 2025年春季花卉展销会鲜花采购合同3篇
- 2025年智能家居设备合作意向协议书3篇
- 2025年物业管理责任服务协议书(含垃圾分类)3篇
- 全国医学博士英语统一考试词汇表(10000词全) - 打印版
- 最新《会计职业道德》课件
- 广东省湛江市各县区乡镇行政村村庄村名明细
- DB64∕T 1776-2021 水土保持生态监测站点建设与监测技术规范
- 中医院医院等级复评实施方案
- 数学-九宫数独100题(附答案)
- 理正深基坑之钢板桩受力计算
- 学校年级组管理经验
- 10KV高压环网柜(交接)试验
- 未来水电工程建设抽水蓄能电站BIM项目解决方案
- 房屋出租家具电器清单
评论
0/150
提交评论