Java套接字swingWorker正在运行但没有收到或传输消息
发布时间:2020-12-15 07:37:10 所属栏目:Java 来源:网络整理
导读:几天前,我尝试创建一个服务器 – 客户端或客户端服务器作为实验来了解使用线程的套接字,但后来有人告诉我应该使用swingWorker.我做了一些研究如何使用并在实践中实现它但它仍然无效. swingWorker线程看起来不像它正在运行,即使我得到一个连接并使用.excute()
几天前,我尝试创建一个服务器 – 客户端或客户端服务器作为实验来了解使用线程的套接字,但后来有人告诉我应该使用swingWorker.我做了一些研究如何使用并在实践中实现它但它仍然无效. swingWorker线程看起来不像它正在运行,即使我得到一个连接并使用.excute().如果你们可以帮助发现我做错了哪个会很棒. SwingWorker类位于startSever()和startClient()方法中.
private void startServer() { SwingWorker <Void,String> runningServer = new SwingWorker<Void,String>(){ 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<server> " + 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<client> " + 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作为“接受”操作,但不是保证. 有关更多信息,请查看How to Write a Action Listener 考虑到你要做的事情的一般复杂性,1是一个整体的好尝试! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |