我想创建服务器,这是能够与多个客户端连接。我的主要功能是:
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(5556);
} catch (IOException ex) {
Logger.getLogger(MakaoServer.class.getName()).log(Level.SEVERE, null, ex);
}
while (true) {
try {
Socket connection = serverSocket.accept();
PlayerConnection playerConn = new PlayerConnection(connection);
playerConn.start();
} catch (IOException ex) {
System.out.println("Nie można było utworzyć gniazda.");
}
}PlayerConnection是一个线程类。run方法:
public void run() {
InputStream input = null;
while (true) {
try {
input = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String msg = reader.readLine();
System.out.println(msg);
} catch (IOException ex) {
Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
} finally {
}
}
}当我运行客户端并将消息发送到服务器时,它被接收到了,但是在下一次while循环迭代中,connection.getInputStream();抛出了一个套接字异常,套接字被关闭。为什么?
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at makaoserver.PlayerConnection.run(PlayerConnection.java:38)发布于 2011-11-25 06:54:30
将输入流和缓冲的读取器放在循环之外。
可能是创建连接到同一个输入流的多个流导致了这种情况。
发布于 2011-11-25 07:00:28
试一试
public void run() {
InputStream input = null;
input = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
while (true) {
try {
String msg = reader.readLine();
System.out.println(msg);
} catch (IOException ex) {
Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
} finally {
}
}
}使用完套接字后,也不要忘记关闭套接字
try {
// Create objects
// do stuff
} finally {
if (obj != null) obj.close();
}https://stackoverflow.com/questions/8263141
复制相似问题