我正在制作一个Java Socket Swing应用程序。我创建了这个空白:
private static void sendMessage(JTextField message) {
try {
String data = user + ": " + message.getText();
out.println(data);
System.out.println(in.readLine());
}
catch(Exception exc) {
JOptionPane.showMessageDialog(dpanel,
"Could not send message. Reason: " + exc, "",
JOptionPane.ERROR_MESSAGE);
}
}
尝试将第二条消息发送到服务器后,程序卡住了。有人可以为我的代码提供任何建议吗?谢谢!
P.S。
sendMessage()
MouseLisitener
触发了{p> JButton
PipeStream
为System.err
,JTextArea
为try {
connection = new Socket(ipa, port);
out = new PrintWriter(connection.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(connection.getInputStream())));
}
...
这就是外出和连接:
{{1}}
答案 0 :(得分:3)
的问题:
答案 1 :(得分:3)
听起来您正试图在Event Dispatching Thread的上下文中调用可能阻塞的I / O.这绝不是一个好主意,任何阻止EDT的东西都会停止(除其他外)重绘请求并阻止EDT处理鼠标和键盘事件......
所有与UI的交互(创建和修改)都应该在EDT的上下文中完成。
我建议你看看Concurrency in Swing的背景......
在您的情况下,您将需要某种能够通过套接字发送和接收数据的Thread
或后台工作者。这将允许您排队消息并处理结果而不会阻止EDT。
但实际实现的方法将归结为您的要求......
答案 2 :(得分:0)
我删除了void部分并将其放入鼠标侦听器中,并在每次发送消息时打开和关闭连接。这阻止了程序崩溃。感谢您帮助我实现我的错误。