第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GUI 在等待來自客戶端的答復時凍結

GUI 在等待來自客戶端的答復時凍結

慕虎7371278 2022-10-26 16:49:30
我目前在運行我正在研究的這個小型戰(zhàn)艦程序時遇到了一些問題。我有兩個 GUI,一個用于服務器,一個用于客戶端。當我單擊“啟動服務器”jButton 時,程序將凍結,直到它從客戶端接收到某些內容。有幫助的 GUI 圖像:通過啟動客戶端程序來解凍它沒有問題,我的問題是,我怎樣才能讓它在等待時不會凍結?多謝。package battleship;import javax.swing.JOptionPane;import java.io.IOException;import java.util.Scanner;import java.net.ServerSocket;import java.net.Socket;import java.io.PrintStream;import java.net.InetAddress;import java.net.SocketAddress;import java.net.UnknownHostException;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JFrame;/** * * @author ftonye */public class BackGroundCom implements Runnable {    private int port;    private ServerSocket ss;    private Socket cs;    private Scanner reader;    private PrintStream writer;    public int missileIncomming;    public int missileOutgoing;    public Boolean dataToSend;    InetAddress sa = null;    public BackGroundCom(int port) {        this.port = port;        dataToSend = true;        missileOutgoing = 100;        startServer();    }    private void startServer() {        try {            sa = InetAddress.getLocalHost();            System.out.println(sa);        } catch (UnknownHostException ex) {            Logger.getLogger(BackGroundCom.class.getName()).log(Level.SEVERE, null, ex);        }        System.out.println("Server started");        try {            ss = new ServerSocket(this.port);            cs = ss.accept();            JOptionPane.showMessageDialog(null, "Server accept connection from" + cs.getInetAddress().getHostAddress());        } catch (IOException ex) {            JOptionPane.showMessageDialog(null, ex.getMessage());        }        System.out.println("Server accept connection");    }我試圖了解如何讓它永遠不會凍結。謝謝
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經(jīng)驗 獲得超2個贊

我希望這cs = ss.accept();是阻塞的呼叫。這將一直阻塞,直到客戶端連接到服務器。您在按下按鈕時運行它,因為在您的按鈕操作代碼中,您構造了 a BackGroundCom,并且該對象的構造函數(shù)調用startServer,它直接執(zhí)行此accept()行。

似乎您正在嘗試設置BackGroundCom對象,以便它在后臺線程中發(fā)生的事情,但我上面所描述的一切都發(fā)生在您創(chuàng)建和運行線程之前。也許您想要做的是將startServer調用移動到對象的run()方法中BackGroundCom。我沒有在 中看到run()方法BackGroundCom,盡管它實現(xiàn)了Runnable. 我認為它在代碼中更進一步。沒有它,這段代碼甚至無法編譯。


查看完整回答
反對 回復 2022-10-26
?
手掌心

TA貢獻1942條經(jīng)驗 獲得超3個贊

史蒂夫是對的。ServerSocket.accept();方法將阻塞,直到建立連接。你必須把它放在另一個里面Thread,這樣它就不會阻塞EDT(Event Dispatching Thread). EDT 是您的 GUI 運行的地方。


public BackGroundCom(int port) {

    this.port = port;

    dataToSend = true;

    missileOutgoing = 100;


    new Thread(() -> (startServer()).start(); // run in new thread

}


查看完整回答
反對 回復 2022-10-26
  • 2 回答
  • 0 關注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號