1

私のプログラムは1回だけ接続をリッスンします...クライアントが接続しない場合、プログラムはclientSocket = serverSocket.accept()でスタックします。つまり、ウィンドウを閉じても中断することはできません。フレームなどのボタンがクリックできません。

私は他のプログラムでも同じようにこのコードを使用しましたが、正常に機能しました(テキストフィールドやボタンをクリックして値を入力できます。このコードでは、クライアントが接続するまでフリーズします。出口)。

public void runServer() {
    try {
        serverSocket = new ServerSocket(PORT_NUMBER, 20);
        clientSocket = serverSocket.accept();
        taDisplay.append("Client connected!");
        lblPlayingTo.setText("Playing to: " + objective);

        socketIn = new DataInputStream(clientSocket.getInputStream());
        socketOut = new DataOutputStream(clientSocket.getOutputStream());

        socketOut.writeUTF(serverName);
        clientName = socketIn.readUTF();
        lblEastScore.setText(clientName + ": " + eastScore.getScore());  

    } catch (IOException e) {
        System.out.println(e);
        taDisplay.append("Could not listen on port: " + PORT_NUMBER + ".\n");
    }
}

これ(以下)を除くすべてのコードを削除しましたが、それでも同じ「フリーズ」の問題が発生します

    setTitle(title);
    setSize(sizeW, sizeH);
    setVisible(visibility);
    setResizable(resizability);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(new MyKeyAdapter());
    addMouseListener(new MyMouseAdapter());

    //Container
    c = getContentPane();
    c.setLayout(new BorderLayout());
4

1 に答える 1

2

serverSocket.accept()GUIのイベントディスパッチスレッド(EDT)で呼び出しを行っているようです。Swingは、ユーザーインタラクションのレンダリングと処理をEDTに依存しています。「accept」などのブロッキング呼び出しを実行すると、GUIに更新が表示されません。

あなたがする必要があるのは、クライアントが接続するのを待っているacceptにある新しいスレッドを作成することです(またはEDTとは異なるアプリケーションの「メイン」スレッドを使用します)。接続後は、必要なすべての作業を実行できますが、GUIを更新する場合は、コードをラップして更新を実行し、Runnableを介してEDTに渡す必要がありSwingUtilities.invokeLaterます。

于 2010-01-31T04:40:21.060 に答える