使用Java套接字实现基本服务器

时间:2014-03-07 07:58:34

标签: java sockets tcp

我正在关注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()初始化,以监听客户端的输出?

2 个答案:

答案 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)

您感到困惑clientclient socketclient发送一些数据,client socket在输入流中读取它。

服务器程序有两种类型的套接字:

  • 一个ServerSocket - 它的工作是监听连接
  • 一个或多个Socket s(在Oracle示例中命名为客户端套接字);服务器从其输入流中读取数据并将数据写入其输出流。

客户端程序只需要使用一个常规Socket