簡體   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