我正在制作一个程序,要求每次客户端从服务器接收数据时都要更新UI。为此,必须每次关闭并重新打开套接字和serversocket。虽然当程序试图接受新连接时,这是我的代码和错误:
public void startServer(){
Thread serverstart = new Thread(){
public void run() {
try {
serversocket = new ServerSocket(socket);
while(true){
skt = serversocket.accept();
close.setEnabled(true);
new Thread(new newClient(skt)).start();
}
} catch (IOException e){
e.printStackTrace();
}
}
};serverstart.start();
}
static class newClient implements Runnable {
private Socket socket;
static PrintStream output;
public newClient(Socket skt){
this.socket = skt;
}
@Override
public void run(){
try {
output = new PrintStream(socket.getOutputStream());
} catch(IOException ioe){
ioe.printStackTrace();
}
}
}
public void sendData(){
tallydata = Integer.toString(preview) + " " + Integer.toString(program);
System.out.println(tallydata);
newClient.output.print(tallydata);
try{
skt.close();
serversocket.close();
} catch(IOException e){
e.printStackTrace();
}
startServer();
}
套接字在sendData()方法结束时关闭,并且调用startServer()方法以在此之后再次重新启动连接。这是错误:
java.net.SocketException: Socket closed
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at TallySystem.servergui$1.run(servergui.java:201)
感谢。
答案 0 :(得分:0)
为什么要关闭并重新打开服务器?只需启动它一次就可以了。这应该如何使用。
无论如何,根据ServerSocket documentation:
public void close()
关闭此套接字。当前在accept()中被阻塞的任何线程都将抛出SocketException。
这正是你的问题所在。您正在忙着等待连接时关闭ServerSocket。