Java 客户没有';t接收来自服务器的输出';s数据输出流

Java 客户没有';t接收来自服务器的输出';s数据输出流,java,networking,tcp,dataoutputstream,Java,Networking,Tcp,Dataoutputstream,我目前正试图编写我的第一个客户端>服务器系统代码,以便通过网络来回传输包含字符串的数据包。但是,我遇到了一个问题,即发生了以下情况: 客户机向服务器发送消息,服务器接收消息,处理消息,然后向客户机发送回复,但客户机从未收到此消息,并挂起等待服务器的响应。代码如下: 服务器: public static void handlePackets() throws Exception { String clientSentence; String returnToClient;

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

服务器:

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 "";
}
1) 您应该关闭或刷新outToServer/outToClient


2) 当您使用BufferedReader进行读取时,您应该使用BufferedWriter而不是DataOutputStream进行写入。客户端正在调用
readLine()
,但服务器没有写入行,只是写入字节,因此客户端将永远等待行终止符。将“\n”附加到服务器的答复中。此外,服务器应在完成接受的套接字后关闭该套接字。通过关闭围绕它的任何写入程序或输出流来实现这一点,而不是关闭套接字本身


您应该使用
BufferedOutputStream
而不是
DataOutputStream
。它可以按原样处理简单的数据,但如果您迟早不修复它,就很容易出现字符集问题。一般来说,您应该始终使用对称的输入和输出流或读卡器。

您是否尝试在
数据输出流上调用
flush()
?另外,为什么要为此使用
DataOutputStream
?这里使用的类似乎不合适。@aroth
flush()
DataOutputStream
上什么都不做,除非它下面有一个
BufferedOutputStream
,而在本例中没有。@EJP这当然意味着永远不需要调用
flush()
socketoutput流上