扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:builder.com.cn 2007年5月14日
关键字:
大部分客户端请求能进入相同的端口,因此也能进入相同的ServerSocket。客户端的连接请求在端口上进行排队,所以服务器可以继续接受请求;然而,服务器可以通过使用线程同时为它们服务(例如,每个客户端连接对应于一个线程)。这个逻辑经常用在多连接Java服务器应用程序上。看看下面的例子:
while (true) {
accept a connection ;
create a thread to deal with the client ;
end while
新线程从客户端读取数据,并将数据写回客户端。当服务器成功地与客户端建立连接之后,服务器端可以使用下面这段代码与客户端通信:
PrintWriter out = new PrintWriter(
clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
String inputLine, outputLine;
while ((inputLine = in.readLine()) != null) {
outputLine = inputLine;
out.println(outputLine);
if outputLine.equals("Bye."))
break;
}
既然这样,服务器将在回复的时候复制所有来到的信息,直到它收到字符串“Bye”。只要服务器与客户端一直在相互通信,服务器就要从socket中读取信息,并将信息写回socket,就这样在服务器和客户端之间来来回回的发送消息。在这之后,服务器将终止所有的流并终止连接。
out.close();
in.close();
clientSocket.close();
serverSocket.close();
客户端
当你开始写客户端程序的时候,服务器应该已经在运行了,并在监听端口等待客户端所发送的连接请求。客户端程序首先要做的就是打开socket使它与运行在主机的服务器和指定的端口进行连接。
import java.io.*;
import java.net.*;
…
theSocket = new Socket("hostname.example.com", 4444);
out = new PrintWriter(theSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
theSocket.getInputStream()));
当你运行这个程序的时候,在Socket构造器中将主机名改成你所在的网络中的机器名。这个计算机是你运行服务器应用程序的地方。当使用socket进行通信时,这个程序也要指定端口号为4444。
这是一个远程端口号(例如:根据服务器端的端口数量选择),它也是服务器正在监听的端口。客户端的socket一定要是未被占用的任意端口(例如,在客户端计算机上的某个端口)。
下面是while循环,这个循环实现了客户端与服务器之间的通信。客户端应用程序将从键盘上读取输入信息(或者标准输入),同时也将这些信息发送给服务器,所以服务器将返回同样的字符串。
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
if (fromServer.equals("Bye."))
break;
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
注意,当服务器说“Bye”的时候,客户端应该终止连接。为了实现这个目的,在“Bye”传输到服务器并返回之后,你需要在客户端说同样的字符串。客户端必须关闭所有的流和连接。
out.close();
in.close();
stdIn.close();
theSocket.close();
结论
Java.net包为网络编程提供了强大且灵活的组织结构。如果你想了解这个包中所提供的类的话,我建议你多引用这个包。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者