这是一个非常基本的例子。
基本上,由于您的程序需要异步通信(也就是说,您需要能够从套接字读取并同时对其进行写入),因此需要将每个流卸载到单独的线程中。
很好,此示例的管理过程不存在。实际上,您应该具有某种“连接”管理器,该管理器可以干净地关闭输出和输入线程,以便例如,当用户键入“再见”时,输出线程将能够告诉连接管理器:连接应终止。然后它将告诉输入线程停止读取任何新消息并终止…
客户
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按“接受”的方式使用,但这并不是保证。
看看如何编写动作监听器以获取更多信息
鉴于您要执行的操作通常很复杂,因此+1是一个很好的整体尝试!



