还是以前发过的那个弱弱的聊天小程序。==TCPServer.java==
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
InputStream in = null;
OutputStream out = null;
try {
ServerSocket server = new ServerSocket(8888);
Socket s = null;
BufferedReader br = null;
BufferedReader localBr = null;
PrintWriter pw = null;
String line = null;
while(true) {
s = server.accept();
System.out.println("A client connected, you can chat now.");
in = s.getInputStream();
out = s.getOutputStream();
br = new BufferedReader(new InputStreamReader(in));
pw = new PrintWriter(out);
localBr = new BufferedReader(new InputStreamReader(System.in));
while(true) {
line = localBr.readLine();
if(line.equals("bye")) {
break;
}
System.out.println("Server: " + line);
pw.println("Server: " + line);
pw.flush();
System.out.println(br.readLine());
}
localBr.close();
br.close();
pw.close();
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}==TCPClient.java==
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
InputStream in = null;
OutputStream out = null;
try {
Socket s = new Socket("222.91.123.168", 8888);
in = s.getInputStream();
out = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
PrintWriter pw = new PrintWriter(out);
BufferedReader localBr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while(true) {
System.out.println(br.readLine());
line = localBr.readLine();
if(line.equals("bye")) {
break;
}
System.out.println("Client: " + line);
pw.println("Client: " + line);
pw.flush();
}
localBr.close();
br.close();
pw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}第一个Client可以和Server完成聊天。但是双方都bye后,再起一个Client时,就会发生错误。Server窗口显示如下:
java.io.IOException: Stream closed
        at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145
)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:308)
        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 TCPServer.main(TCPServer.java:23)Client窗口显示如下:
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        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 TCPClient.main(TCPClient.java:16)请问这是怎么回事?该怎么解决呢?

解决方案 »

  1.   

    bye之后s.close();这个执行了,理所当然,server接受不到client的请求了!
    最后server里不要写这样关闭的功能,client里写就可以了!最好server是无限循环!
      

  2.   

    沿用楼上了思路,最好把每个客户端就是一个线程,如果是要做的更有效率点的话,可以建立个线程池.
            还有就是释放资源的方法最好是把它们都放在一个方法里--------tearDownConnection()............