java - 客户端未收到服务器 DataOutputStream 的输出

标签 java networking tcp dataoutputstream

我目前正在尝试编写我的第一个客户端>服务器系统,以通过网络来回传输包含字符串的数据包。但是我遇到了一个问题,因为发生了以下情况: 客户端向服务器发送消息,服务器接收消息,处理消息,然后向客户端发送回复,但客户端从未收到此消息并挂起等待服务器的响应。这是代码:

服务器:

public static void handlePackets() throws Exception {
    String clientSentence;
    String returnToClient;
    ServerSocket welcomeSocket = new ServerSocket(1337);

         System.out.println("Packet receiver initialized!");
         while (run) {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println("Received Packet: " + clientSentence);


            System.out.println("Compiling return to client.");
            returnToClient = "";
            if (clientSentence.startsWith("Handshake-")) {
                returnToClient = handleHandShake(clientSentence);
            }

            outToClient.writeBytes(returnToClient);
            System.out.println("Sent client response " + returnToClient);
         }
         welcomeSocket.close();
  }

客户:

public static String sendTCP(String host, String content) {
    try {
        System.out.println("Packet sender sending TCP packet " + content);
        String serverResponse;
        Socket clientSocket = new Socket(host, 1337);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        outToServer.writeBytes(content + '\n');

        System.out.println("Send data to sever. Awaiting response.");

        serverResponse = inFromServer.readLine();
        clientSocket.close();

        System.out.println("Server response received " + serverResponse + " result was returned to caller.");

        return serverResponse;
    } catch (Exception e) {
        e.printStackTrace();
    }


    return "";
}

最佳答案

客户端正在调用readLine(),但服务器并没有写入一行,只是写入字节,因此客户端永远等待行终止符。将“\n”附加到服务器的回复中。服务器完成处理后还应关闭已接受的套接字。通过关闭您包裹的任何写入器或输出流来完成此操作,而不是关闭套接字本身。

您应该使用BufferedOutputStream而不是DataOutputStream。它适用于简单的数据,但如果您迟早不修复它,您可能会遇到字符集问题。一般来说,您应该始终使用对称的输入和输出流或读取器。

关于java - 客户端未收到服务器 DataOutputStream 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14680320/

相关文章:

android - 本地网络中的设备发现

Java 未捕获的全局异常处理程序

java - 你如何在 Java 中使用 lambda 表达式对字符串进行排序?

c++ - 单线程应用程序可能会在阻塞模式下尝试将 QTcpSocket 连接到它自己的 QTcpServer 时超时吗?

Android 到 Android TCP 连接

java - ServerSocket reuseAddress 允许绑定(bind)到一个已经绑定(bind)的端口?

ruby - 如何在 Minitest 中为 TCPSocket 编写多个测试

java - ImmutableSortedMap - 映射中的重复键

java - Play! 的异步程度如何?框架

android - 在Android上检测wifi IP地址?