我正在尝试使用java制作多线程服务器/客户端应用程序!此代码用于名为Bsocket(iserver.core.socket)的包的类中的listen()方法:
try {
serverSocket = new ServerSocket(port);
}catch(IOException e ){
ui.log(e.toString());//*
}
while (true){
try{
clienSocket = serverSocket.accept();
ui.log("Incomming Connection.");//*
new connectionHandler(clienSocket, ui);
}catch(IOException e ){
ui.log(e.toString());
}
}
ui.log("Incomming Connection.");
是Bgui(iserver.core.ui)主类下面的一个方法.Bgui是一个包含textarea和其他内容的jframe!问题是当执行accept方法时,ui.log
不起作用!什么错了?
答案 0 :(得分:7)
由于.accept
是阻止呼叫,因此您需要在单独的线程上启动服务器。您可能想要这样做:
(new Runnable() {
@Override
public void run()
{
try {
serverSocket = new ServerSocket(port);
}catch(IOException e ){
ui.log(e.toString());//*
}
while (true){
try{
clienSocket = serverSocket.accept();
ui.log("Incomming Connection.");//*
new connectionHandler(clienSocket, ui);
}catch(IOException e ){
ui.log(e.toString());
}
}
}
}).start();
注意:此代码未经过测试,但它可以让您了解需要执行的操作。
答案 1 :(得分:6)
Socket.accept()
阻塞,直到有接收的传入连接(请参阅文档)。你不应该从你的UI线程进行任何阻塞调用 - 否则它会......你知道......阻止!
答案 2 :(得分:4)
您需要将UI线程与您自己的网络服务线程分开。 accept()正在阻塞(显然)并冻结你的应用程序,直到你得到一个新的客户端,并再次冻结等待更多的客户端。