2010-01-31 23 views
1

我的程序偵聽只是一個連接一次...程序只是被卡在ClientSocket的=的ServerSocket.accept()如果沒有客戶端連接。我的意思是我甚至無法通過關閉窗戶來打斷它。我無法點擊任何按鈕,我在我用這個代碼在我的其他程序以同樣的方式在框架等計劃去反應遲鈍的ServerSocket.accept處 - Java的

,但它工作得很好(我可以點擊他們的文本框和按鈕之類的東西和類型的值,對於這個,它只是在那裏凍結,直到客戶端連接,甚至不能退出)。

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()); 
+0

你的代碼在哪裏調用「runServer」? – Ash 2010-01-31 04:55:37

回答

2

這聽起來像你正在做的GUI的事件您的通話serverSocket.accept()調度線程(EDT)。 Swing依靠EDT來呈現和處理用戶交互 - 如果您執行阻止調用(如「接受」),則在GUI上將看不到任何更新。

你需要什麼做的就是創建一個新的線程(或使用應用程序的「主」線程,這是對EDT不同),關於坐在接受等待客戶端連接。連接完成後,它可以完成所需的任何工作,但是當您想更新GUI時,需要將代碼打包到Runnable中進行更新,然後通過SwingUtilities.invokeLater傳遞給EDT。

+0

謝謝,我明白你的意思了。我已經運行在不同的線程,它的工作原理。 – Dois 2010-01-31 05:06:23

相關問題