繁体   English   中英

Java-套接字摆动应用程序崩溃

[英]Java - Socket Swing Application Crashes

我正在制作一个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()MouseLisitenerJButton触发。
有一个System.errPipeStream并输出到JTextArea
这是输入输出,连接是:

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

问题:

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

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

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

我建议您一些背景下看看Swing中的并发 ...

在您的情况下,您将需要某种能够通过套接字发送和接收数据的Thread或后台工作器。 这样一来,您就可以在不阻止EDT的情况下,对正在进行的邮件进行排队并处理结果。

但是,实际上如何实现将取决于您的要求。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM