0

我正在制作一个 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);
    }
}

在我尝试将第二条消息发送到服务器后,程序卡住了。有人可以为我的代码提供任何建议吗?谢谢!

附言

sendMessage()由 a MouseLisitenerfor a触发JButton
有一个PipeStreamforSystem.err和 out to a JTextArea
这就是输入输出和连接是/是:

try {
    connection = new Socket(ipa, port);
    out = new PrintWriter(connection.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(connection.getInputStream())));
}
...
4

3 回答 3

3

问题:

  • 为什么是静态方法?除非有充分的理由,否则您应该避免所有静态问题,而这里没有。
  • 你没有提到你是如何处理你的线程的,这很可能会导致你的问题。您是否使用 SwingWorker 来创建后台线程?您是否注意在 Swing 事件线程上进行所有 Swing 调用?
  • 您声明您让 JButton 使用 MouseListener,这不是一个好习惯。JButton 的构建是为了最好地响应 ActionListener。这将触发对 JButton 状态的视觉更改,并且还允许您通过禁用 JButton 来禁用操作。我建议您阅读 Oracle Swing 教程按钮部分以获取更多详细信息。
于 2013-01-15T00:25:33.200 回答
3

听起来您正试图从事件调度线程的上下文中调用潜在的阻塞 I/O。这绝不是一个好主意,任何会阻止 EDT 的东西都会停止(除其他外)重绘请求并阻止 EDT 处理鼠标和键盘事件......

所有与 UI 的交互(创建和修改)都应该在 EDT 的上下文中完成。

我建议您查看Swing 中的并发以了解一些背景...

在您的情况下,您将需要某种Thread能够通过套接字发送和接收数据的或后台工作人员。这将允许您在不阻塞 EDT 的情况下排队发送消息并处理结果。

但是这实际上是如何实现的将归结为你的要求是什么......

于 2013-01-15T00:25:56.517 回答
0

我删除了 void 部分并将其放入鼠标侦听器中,并在每次发送消息时打开和关闭连接。这防止了程序崩溃。感谢您帮助我认识到我的错误。

于 2013-01-15T15:21:53.067 回答