Socket是指在一个特定编程模型下,进程间通信链路的端点。因为这个特定编程模型的流行,Socket这个名字在其他领域得到了复用,包括Java叫技术。
如果要建立连接,一台机器必须运行一个进程来等待连接,而另一台机器必须试图到达第一台机器。这个电话系统类似:一方必须发起呼叫,而另一方在此时必须等待电话呼叫。
java网络模型图
下面通过一个有“回显”功能的服务器和客户端来介绍应用java.net包编写网络应用程序。
这个例子主要功能是服务器端的程序等待客户的输入,然后将读取到的信息回显给客户端,同时在服务器端的控制台输出。而客户端从控制台接收信息后,向客户端发送输入,并接收服务器的回显数据,然后显示在控制台。
客户端程序代码如下:
package com.javapp.ch11; import java.io.*; import java.net.*; /** * Description: 具有“回显”功能的服务器端和客户端程序 */ public class EchoClientDemo { // 服务器端的服务端口。 public static final int SERVERPORT = 990; public static void main(String[] args) { try { // 建立连接套接字。 Socket s = new Socket("localhost",SERVERPORT); System.out.println("socket = " + s); // 新建网络连接的输入流。 BufferedReader in = new BufferedReader(new InputStreamReader(s .getInputStream())); // 新建网络连接的自动刷新的输出流。 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(s.getOutputStream())),true); // 先使用System.in构造InputStreamReader,再构造BufferedReader。 BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.println("Enter a string, Enter BYE to exit! "); while (true) { // 读取从控制台输入的字符串,并向网络连接输出,即向服务器端发送数据。 out.println(stdin.readLine()); // 从网络连接读取一行,即接收服务器端的数据。 String str = in.readLine(); // 如果接收到的数据为空(如果直接按Enter,不是空数据),则退出循环,关闭连接。 if (str == null) { break; } System.out.println(str); } s.close(); } catch (IOException e) { System.err.println("IOException" + e.getMessage()); } } } |