は、すべてのタイトルである: 私はボタンをクリックしたときに、サーバーにメッセージを送信するJavaクライアントを、作成し、複数のクライアントが同じ時間に接続することができ、ここに私のソースコードは次のとおりです。マルチスレッドサーバー:SwingWorkerとスレッド?
クライアント:
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();
}
現在、私はそれが動作するメッセージを送信するときに私のサーバーは、小さな誤差が含まれていますが、その後、すべての受信メッセージがnullです...以下を参照してください。
私はこの問題は、サーバーにsocClient = server.accept();
の後にスレッドを作成しなかったと思いますか? それが最善だろう何ケースの場合:?SwingWorkerの中
使用SwingWorkerの。
Runnableインターフェイスで古典的なスレッドを作成します。
その他この問題を解決する方法は何ですか? ありがとう^^。
'catch(IOException e){}'なぜですか? – artbristol
私はこれを試して、後で戻ってきます。ありがとうございます。 –
クライアントとサーバでメッセージを送受信した直後にストリームを閉じています。メッセージが送信された後、ストリームが閉じられ、再度書き込み/読み取りできなくなることを意味します。 –