Java套接字swingWorker正在运行但没有收到或传输消息

几天前,我试图创建一个服务器 – 客户端或客户端服务器作为实验来了解使用线程的套接字,但后来有人告诉我应该使用swingWorker。 我做了一些研究如何使用并在实践中实现它但它仍然无效。 swingWorker线程看起来不像它正在运行,即使我得到一个连接并使用.excute()。 如果你们可以帮助发现我做错了哪个会很棒。 SwingWorker类位于startSever()和startClient()方法中。

private void startServer() { SwingWorker  runningServer = new SwingWorker(){ protected Void doInBackground() { try { listeningSocket = new ServerSocket(port); System.out.println("waiting for connection"); connection = listeningSocket.accept(); connected = true; System.out.println("Connected"); String incomeMessage =null; while(connected){ inStream = connection.getInputStream(); inDataStream = new DataInputStream(inStream); if (myMessage !=null){ outStream = connection.getOutputStream(); outDataStream = new DataOutputStream(outStream); outDataStream.writeUTF(myMessage); } if((incomeMessage = inDataStream.readUTF())!=null){ clientMessage = incomeMessage; publish(clientMessage); incomeMessage =null; } } } catch (IOException e) { clientMessage = "Connection Lost"; } return null; } runningServer.execute(); } 

这是一个非常基本的例子。

基本上,因为您的程序需要异步通信(也就是说,您需要能够从套接字读取并同时写入它),您需要将每个流卸载到一个单独的线程。

这个例子的管理过程是,现在不存在。 实际上,你应该有一种能够干净地关闭输出和输入线程的“连接”管理器,这样,例如,当用户输入“bye”时,输出线程就能告诉连接管理器连接应该终止。 然后它会告诉输入线程停止读取任何新消息并终止…

客户

 public class Client { public static void main(String[] args) { try { Socket master = new Socket("localhost", 8900); new Thread(new InputHandler(master)).start(); new Thread(new OuputHandler(master)).start(); } catch (Exception ex) { ex.printStackTrace(); } } public static class InputHandler implements Runnable { private Socket socket; public InputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (commune) { String text = reader.readLine(); System.out.println("\n " + text); if (text.toLowerCase().equals("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { reader.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } public static class OuputHandler implements Runnable { private Socket socket; public OuputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedWriter writer = null; try { writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); Scanner scanner = new Scanner(System.in); while (commune) { System.out.print("> "); String text = scanner.nextLine(); writer.write(text); writer.newLine(); writer.flush(); if (text.equalsIgnoreCase("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { writer.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } } 

服务器

 public class Server { public static void main(String[] args) { try { ServerSocket master = new ServerSocket(8900); Socket socket = master.accept(); new Thread(new InputHandler(socket)).start(); new Thread(new OuputHandler(socket)).start(); } catch (Exception ex) { ex.printStackTrace(); } } public static class InputHandler implements Runnable { private Socket socket; public InputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (commune) { String text = reader.readLine(); System.out.println("\n " + text); if (text.toLowerCase().equals("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { reader.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } public static class OuputHandler implements Runnable { private Socket socket; public OuputHandler(Socket socket) { this.socket = socket; } @Override public void run() { boolean commune = true; BufferedWriter writer = null; try { writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); Scanner scanner = new Scanner(System.in); while (commune) { System.out.print("> "); String text = scanner.next(); writer.write(text); writer.newLine(); writer.flush(); if (text.equalsIgnoreCase("bye")) { commune = false; } } } catch (Exception exp) { exp.printStackTrace(); } finally { try { writer.close(); } catch (Exception e) { } try { socket.close(); } catch (Exception e) { } } } } } 

更新(抱怨)

虽然我的源代码在我面前……

应该非常非常非常需要做textMessage.addKeyListener(this)

因为您使用的是JTextField ,所以您应该使用ActionListener 。 这有很多重要的原因,但对你而言,主要的原因是“接受”行为是依赖于外观的。 虽然大多数系统确实使用Enter作为“接受”操作,但不是保证。

有关更多信息,请参阅如何编写动作侦听器

考虑到你要做的事情的一般复杂性,+1为整体的好尝试!

使用此示例 ,以下更改适用于单个telnet客户端。

 private PrintWriter out; ... public void keyPressed(KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_ENTER) { myMessage = friendLabel + textMessage.getText(); if (out != null) { out.println(myMessage); } ... } ... protected Void doInBackground() { try { listeningSocket = new ServerSocket(port); System.out.println("Waiting for connection"); connection = listeningSocket.accept(); connected = true; System.out.println("Connected"); Scanner in = new Scanner(connection.getInputStream()); out = new PrintWriter(connection.getOutputStream(), true); publish("Connected"); while (true) { publish(in.nextLine()); } } catch (IOException e) { clientMessage = "Connection Lost"; try { connection.close(); System.out.println("Closed"); } catch (IOException e1) { e1.printStackTrace(); connected = false; } } return null; } 

我看到你的服务器端口是8900,你的客户端端口也是8900。 我不确定服务器和客户端是否在同一台机器上运行是否重要…