Java - 套接字Swing应用程序崩溃

时间:2013-01-15 00:11:56

标签: java swing sockets

我正在制作一个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 PipeStreamSystem.errJTextAreatry { connection = new Socket(ipa, port); out = new PrintWriter(connection.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(connection.getInputStream()))); } ... 这就是外出和连接:

{{1}}

3 个答案:

答案 0 :(得分:3)

的问题:

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

答案 1 :(得分:3)

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

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

我建议你看看Concurrency in Swing的背景......

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

但实际实现的方法将归结为您的要求......

答案 2 :(得分:0)

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