全部在标题中: 我创建了一个java客户端,当我单击按钮时,它会向服务器发送一条消息,多个客户端可以同时连接,这是我的源代码:
客户:
private void simulerMessageActionPerformed(java.awt.event.ActionEvent evt) {
try {
log.append("wait for connexion..\n");
socket=new Socket(ip.getText(),Integer.parseInt(port.getText()));
log.append("Connexion to the server ok");
BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); ligne.
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true);
String str = "test1";
log.append("\n"+str+"\n");
out.println(str);
in.close();
out.close();
socket.close();
} catch (UnknownHostException ex) {
Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
}
}
服务器:
private void demarreActionPerformed(java.awt.event.ActionEvent evt) {
sw=new SwingWorker<String,Void> (){
protected String doInBackground() throws Exception {
try {
server = new ServerSocket(Integer.parseInt(port.getText()));
} catch (IOException ex) {
return "already in use";
}
String str1="waiting for connexion";
String str2="Connexion ok";
log.append(str1+"\n");
PrintWriter out=null;
BufferedReader in=null;
Socket socClient=null;
while(ecoute){
try{
socClient = server.accept();
}catch(java.net.SocketException e){
return "[user] Server Stoped";
}
log.append(str2+"\n");
in = new BufferedReader(
new InputStreamReader(socClient.getInputStream())
);
out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(socClient.getOutputStream())),
true);
String str = in.readLine();
log.append(str+"\n");
}
return "fatal error";
}
protected void done(){
String m="";
try {
m=get();
} catch (InterruptedException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
log.append(m+"\n");
}
};
sw.execute();
}
目前,当我发送消息时,我的服务器包含一个小错误,它可以工作,但之后所有收到的消息都是空的......请参阅:
我认为问题来自于我在 server 中的 socClient = server.accept();
之后没有创建线程?
如果是这样的话,什么是最好的?:
在 SwingWorker 中使用 SwingWorker。
使用 Runnable 接口(interface)创建经典线程。
否则有什么解决方案可以解决这个问题? 谢谢^^。
最佳答案
在这种情况下您可能不应该使用 SwingWorker。当准备好更新 GUI 时,您应该让后台处理线程调用 SwingUtilities.invokeLater()。通常,SwingWorker 用于由 GUI 事件启动的操作,例如单击按钮或菜单项,这样 GUI 就不会挂起,并且您可以随着时间的推移获取 GUI 的更新。重要的是确保您的 GUI 更新在 EDT 上完成,SwingUtilities.invokeLater() 将处理该问题。作为基本 Thread/Runnable 的替代方案,也可以看看 Future、Callable 和 Executors,这可能会给您一些如何构造它的想法。 SwingWorker 在内部使用它们。
关于java - 多线程服务器: SwingWorker Vs Thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9600215/