Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字丢失数据:BufferedReader_Java_Sockets_Tcp_Bufferedreader_Java Io - Fatal编程技术网

Java套接字丢失数据:BufferedReader

Java套接字丢失数据:BufferedReader,java,sockets,tcp,bufferedreader,java-io,Java,Sockets,Tcp,Bufferedreader,Java Io,我在java中遇到了以下问题:我正在使用java.net.Socket开发和安装应用程序。看起来是这样的:有一个服务器,它有一个接受并添加新客户机的线程,另一个线程从套接字读取数据并对其进行处理。旁边是客户。客户机有数据读取器线程和单独的线程。我发送的数据非常简单,如下所示: socket.getOutputStream().write((content+"\n").getBytes()); 在客户端,并在服务器上读取,如: try { BufferedReader reader =

我在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();
}
对于服务器端的数据读取器:

socket = serverSocket.accept();
在客户机上:

socket = new Socket("127.0.0.1", Server.PORT)
这不是一个“效率问题”。这是代码中的一个bug

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

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

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
拆下这条线

按照您的方式,每次先前的BufferedReader进行缓冲时,都会丢失数据

您还需要关闭插座。

这不是“效率问题”。这是代码中的一个bug

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
问题是并非所有消息都传输到服务器

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

reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
拆下这条线

按照您的方式,每次先前的BufferedReader进行缓冲时,都会丢失数据


您还需要关闭套接字。

如何初始化套接字?另外,为什么在while循环中每次迭代都要创建一个新的阅读器?您是否在日志中看到错误?您的服务器端代码片段意味着您将以静默方式忽略任何SocketException;也许还可以正确地记录这些?我不会默默地忽略它们,因为从Eclipse开始:异常SocketException已经被替代IOException捕获,并且没有SocketException。循环中的读卡器初始化是一个错误,我删除了它,但它仍然没有改变任何东西。编辑中的套接字初始化。在服务器读取所有消息之前,在发送for循环之后,客户端可能正在以未显示的代码关闭连接?您如何知道没有SocketException?如果有人扔了一个,你会抓住它然后忽略它,对吗?尝试完全删除该catch块。如何初始化套接字?另外,为什么在while循环中每次迭代都要创建一个新的阅读器?您是否在日志中看到错误?您的服务器端代码片段意味着您将以静默方式忽略任何SocketException;也许还可以正确地记录这些?我不会默默地忽略它们,因为从Eclipse开始:异常SocketException已经被替代IOException捕获,并且没有SocketException。循环中的读卡器初始化是一个错误,我删除了它,但它仍然没有改变任何东西。编辑中的套接字初始化。在服务器读取所有消息之前,在发送for循环之后,客户端可能正在以未显示的代码关闭连接?您如何知道没有SocketException?如果有人扔了一个,你会抓住它然后忽略它,对吗?试着把那个挡块全部卸下。
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));