我正在关注Oracle的Java套接字教程:docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html
try (
// ...
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
) {
String inputLine, outputLine;
// Initiate conversation with client
KnockKnockProtocol kkp = new KnockKnockProtocol();
outputLine = kkp.processInput(null);
out.println(outputLine);
while ((inputLine = in.readLine()) != null) {
outputLine = kkp.processInput(inputLine);
out.println(outputLine);
if (outputLine.equals("Bye."))
break;
}
本教程指出“readLine方法等待客户端通过向其输出流(服务器的输入流)写入内容来响应”。
但服务器的输入流“in”是使用客户端的输入流而不是其输出流初始化的。
不应该在“in”中用clientSocket.getOutputStream()初始化,以监听客户端的输出?
答案 0 :(得分:0)
每个客户端都写入输出流。客户端写入其输出流的消息将发送到服务器,该服务器从与此客户端套接字关联的输入流中读取它。
服务器还有每个客户端套接字的输出流。客户端可以使用其输入流读取服务器写入此输出流的消息:
output stream ----------> input stream
server client1 socket client 1 socket
input stream <----------- output stream
output stream ----------> input stream
server client2 socket client 2 socket
input stream <----------- output stream
答案 1 :(得分:0)
您感到困惑client
和client socket
。 client
发送一些数据,client socket
在输入流中读取它。
服务器程序有两种类型的套接字:
ServerSocket
- 它的工作是监听连接Socket
s(在Oracle示例中命名为客户端套接字);服务器从其输入流中读取数据并将数据写入其输出流。客户端程序只需要使用一个常规Socket
。