我的代码在这里: https://github.com/sandyw/Simple-Java-Client-Server 我遇到了一些问题,可能是相关的问题。其中一个问题是,偶尔会有一个客户端线程抛出异常。
java.net.SocketException: Socket closed
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 ClientThread.run(ClientThread.java:45)
at java.lang.Thread.run(Thread.java:680)
由于其位置,这意味着服务器在客户端完成读取之前关闭了套接字。我该如何防止这种情况发生?
另外,即使计算引发Socket closed
异常的线程数,似乎并不是所有服务器线程都发送其输出。例如,30个服务器线程中的23个将发送其输出,但只有22个客户端线程会收到任何内容。通信显然在某处丢失,我该如何防止这种情况?
ClientThread.java
的55-57行中,我认为您不需要单独关闭流而不是关闭套接字。尝试不这样做(在客户端和服务器端都是如此),看看会发生什么。最后(3)查看close()
方法的JavaDoc,并查看是否有任何内容可以阐明正在发生的情况:http://download.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html#close%28%29,以避免过早关闭。 - jefflunt