计划去反应迟钝的ServerSocket.accept处 - Java的

问题描述:

我的程序侦听只是一个连接一次...程序只是被卡在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

这听起来像你正在做的GUI的事件您的通话serverSocket.accept()调度线程(EDT)。 Swing依靠EDT来呈现和处理用户交互 - 如果您执行阻止调用(如“接受”),则在GUI上将看不到任何更新。

你需要什么做的就是创建一个新的线程(或使用应用程序的“主”线程,这是对EDT不同),关于坐在接受等待客户端连接。连接完成后,它可以完成所需的任何工作,但是当您想更新GUI时,需要将代码打包到Runnable中进行更新,然后通过SwingUtilities.invokeLater传递给EDT。

+0

谢谢,我明白你的意思了。我已经运行在不同的线程,它的工作原理。 – Dois 2010-01-31 05:06:23