0

我有一个 Java 桌面服务器和多个使用套接字的 Android 平板电脑客户端。两个或三个客户端中的每一个都向服务器发送一条短信,服务器发送一条响应消息。两篇短文。

服务器为每个客户端连接启动一个单独的线程。

问题是我设置了两个客户端并从每个客户端发送短信,然后其中一个客户端在发送一些消息后总是冻结并停止发送或接收更多消息。并非总是如此,但大约 50% 的时间。

我尝试调整套接字的超时时间并将 bufferedWriter 添加到输出流中。但是这两个变化都没有帮助。

桌面java应用程序,服务器我得到:

致命的: Fatal excepiton, null, java.net.SocketTimeoutException: Read timed out

一台Android平板电脑,客户端,我得到:

 03-01 17:31:13.740: W/System.err(2992): java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)

有没有共同的原因,或者我可以尝试什么?

完整的服务器 logcat 如下所示:

2013/03/01 17:33:17 com.example.lotterygame.MultiThreader run
致命的: null
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at jp.co.forever.lotterygame.MultiThreader.run(MultiThreader.java:43)
    at java.lang.Thread.run(Thread.java:662)

编辑,

在服务器中添加了 null 来自的行,

它在下面的代码中---> while((line = in.readLine())!= null){

    @Override
public void run() {
    try {       
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

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

     System.out.println("streams are setup from new thread\n");

     String line ="";

            while((line = in.readLine())!= null){

                SocketPack spk = new SocketPack(socket, line.trim());
                this.messageFromClient(spk);


            }

              out.close();
              in.close();
              socket.close();
    } // end run
    catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    } // end run

    public void messageFromClient(SocketPack msgc){
        this.setChanged();
        this.notifyObservers(msgc);
    }
4

1 回答 1

0

“null”来自您自己的代码,当您捕获 IOException 时,您会在其中记录null。

相关的事情是超时,发生这种情况是因为您设置了读取超时,并且它发生了,即对等方在那段时间内没有发送任何内容。

“连接重置”可能是对等方超时导致对等方关闭连接和/或退出的结果。

于 2013-03-01T21:46:54.170 回答