Java 套接字丢失数据:BufferedReader

Java sockets losing data: BufferedReader

我在 java 中遇到以下问题:我正在使用 java.net.Socket 开发应用程序。它看起来是这样的:有一个服务器有一个线程接受并添加新的客户端,另一个线程从套接字读取数据并用它做"something"。旁边是客户。客户端有数据 reader 线程以及一个单独的线程。我发送的数据很简单:

socket.getOutputStream().write((content+"\n").getBytes());

在客户端并在服务器端阅读,如:

try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String received;
    while(true) {
        try {
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            received = reader.readLine();
            if(received == null) {
                break;
            }
            System.out.println("SERVER " + received);
            increaseReceivedCounter(1);
        } catch(SocketException e) {
            break;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    System.out.println("SERVER RECEIVED "+ getReceivedCounter() + " MESSAGES!");
}

现在我只是将客户端设置为发送一定数量的消息,如下所示:

try {
    int n = 1000;
    System.out.println("sending "+ n +" messages to " + client);
    for(int i=0 ; i<n ; ++i) {
        socket.getOutputStream().write((content+"\n").getBytes());
    }
    System.out.println("done sending " + n + " messages");
} catch (IOException e) {
    e.printStackTrace();
}

问题是并非所有邮件都被传输到服务器。我一直在为此寻找一些解决方案,但未能达到 100% 的可靠性。有可能吗?我也尝试使用 read 而不是 readLine 但结果是一样的:有时甚至会丢失 90% 的数据。我认为当服务器正在处理接收到的数据时,它会忽略传入的数据包并且它们只是丢失了。

编辑

Sockets 初始化:

serverSocket = new ServerSocket(Server.PORT);//PORT = 9876, whatever

对于服务器端的数据reader:

socket = serverSocket.accept();

在客户端上:

socket = new Socket("127.0.0.1", Server.PORT)

这是而不是 'efficiency issue'。这是您代码中的错误。

The problem is that not all of the messages are transferred to a server.

不,问题是您在 服务器上丢失了数据。这是因为您一直在重新创建 BufferedReaders。您应该在套接字的生命周期内创建一次。

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

删除此行。

你拥有它的方式,每次先前的 BufferedReader 有,错误,缓冲时你都会丢失数据。

您还需要关闭套接字。