【问题标题】:Implementing basic server using Java Sockets使用 Java 套接字实现基本服务器
【发布时间】:2014-03-07 07:58:33
【问题描述】:

我正在关注 Oracle 的 java sockets 教程: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”是使用客户端的输入流初始化的,而不是它的输出流。

不应该用clientSocket.getOutputStream()来初始化“in”,来监听客户端的OUTput吗?

【问题讨论】:

    标签: java sockets tcp


    【解决方案1】:

    您混淆了clientclient socketclient 发送一些数据,client socket 在输入流中读取它。

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

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

    客户端程序只需要使用一个普通的Socket

    【讨论】:

    • 由于套接字是此客户端服务器链接docs.oracle.com/javase/tutorial/networking/sockets 中的一个端点,我认为 clientSocket 是客户端的表示。因此,如果客户端写入服务器读取的 outputStream,服务器应该监听 clientSocket 的 outputStream。我不明白为什么 client 和 clientSocket 不是同义词。
    • @HukeLau_DABA:假设您连接到 google.com。客户就是你。您打开了一个可以与 Google 交谈的套接字。然后你写入你的套接字输出流。在另一边,在谷歌数据中心,谷歌,服务器,为你准备了一个套接字。 Google 会通过从该套接字输入流中读取您发送的消息来接收它们。
    【解决方案2】:

    每个客户端都写入一个输出流。客户端写入其输出流的消息会发送到服务器,服务器会从与此客户端套接字关联的输入流中读取消息。

    服务器还为每个客户端套接字提供一个输出流。服务器写入此输出流的消息可以由客户端使用其输入流读取:

                           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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2015-09-16
      • 1970-01-01
      • 2014-08-28
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多