丢失数据的Java套接字:BufferedReader

时间:2016-10-07 21:21:41

标签: java sockets tcp bufferedreader java-io

我在java中遇到以下问题:我正在使用java.net.Socket进行开发和应用。它看起来像:有一个服务器有一个接受和添加新客户端的线程,另一个线程从套接字读取数据并做了什么"用它。旁边有客户。客户端具有数据读取器线程以及单独的线程。我发送的数据简单如下:

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%的数据丢失。我认为当服务器正在处理收到的数据时,它会忽略传入的数据包,而它们只是丢失了。

修改

Socket初始化:

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

用于服务器端的数据阅读器:

socket = serverSocket.accept();

在客户端:

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

1 个答案:

答案 0 :(得分:4)

<&#39;效率问题&#39;。这是您代码中的错误。

  

问题是并非所有消息都传输到服务器。

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

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

删除此行。

你拥有它的方式,每次前一个BufferedReader有错误,你就会丢失数据。

您还需要关闭套接字。