1、Java 网络编程基础 Socket 类的使用方法详解.txt 心态决定状态,心胸决定格局,眼界决定境界。当你的眼泪忍不住要流出来的时候,睁大眼睛,千万别眨眼,你会看到世界由清晰到模糊的全过程。当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket 对象,Socket 类有几个构造函数。 两个常用的构造函数是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),两个构造函数都创建了一个基于 Socket 的连接服务器端流套接字的流套接字。对于第一个 InetAddress 子类对象通过 add
2、r 参数获得服务器主机的 IP 地址,对于第二个函数 host 参数包被分配到 InetAddress 对象中,如果没有 IP 地址与 host 参数相一致,那么将抛出 UnknownHostException 异常对象。两个函数都通过参数 port 获得服务器的端口号。假设已经建立连接了,网络 API 将在客户端基于 Socket 的流套接字中捆绑客户程序的 IP 地址和任意一个端口号,否则两个函数都会抛出一个 IOException 对象。 如果创建了一个 Socket 对象,那么它可能通过调用 Socket 的 getInputStream()方法从服务程序获得输入流读传送来的信息,也可
3、能通过调用 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.clo
4、se ();接下面我们将示范一个流套接字的客户程序,这个程序将创建一个 Socket 对象,Socket 将访问运行在指定主机端口 10000 上的服务程序,如果访问成功客户程序将给服务程序发送一系列命令并打印服务程序的响应。List2 使我们创建的程序 SSClient 的源代码: Listing 2: SSClient.java / SSClient.javaimport java.io.*;import .*; class SSClientpublic static void main (String args)String host = “localhost“;/ If user sp
5、ecifies a command-line argument, that argument/ redivsents 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);/ Crea
6、te 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 ();/ Crea
7、te 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 sockets byte-/ oriented output stream. The print writer creates an/ intermediate o
8、utput 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);/ Send the DATE command to the server.pw.println (“DATE“);/ Obtain and print the current date/time.System.out.p
9、rintln (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 (
10、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 (IOExcepti
11、on e)System.out.println (e.toString ();finallytryif (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 的输入
12、输出流,围绕 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()将返回服务程序的端口号。