本文共 5156 字,大约阅读时间需要 17 分钟。
TCP协议的Java支持是一个非常重要的主题,特别是在实现基于TCP/IP协议的网络通信时。默认TCP协议提供了流套接字,而UDP协议提供了数据报套接字。流套接字基于TCP协议,其特点是面向连接,能够确保数据包的可靠传输,适合需要稳定通信的场景。TCP协议的强度显著低于UDP,因此在需要可靠性和有序通信的业务场景下更为理想。
在Java中,TCP通信主要通过ServerSocket
和Socket
类来实现。ServerSocket
用于初始化服务器端的套接字,监听特定的端口是否有客户端连接。服务器程序可以重复调用accept()
方法来获取客户端连接,并创建相应的Socket
实例。与此同时,服务器套接字也会为每次连接启动一个新的线程,负责与客户端进行通信。这些线程共享服务器的输入输出流,在数据传输完成后,通过close()
方法关闭相应的连接。
在客户端程序中,类似地,通过创建Socket
实例并连接到服务器端的指定端口来建立连接。客户端和服务器端的Socket
实例通过输入输出流进行数据交换。为了方便处理,可以使用BufferedReader
包装输入流,使用PrintStream
包装输出流,从而实现便捷的数据读写操作。这一点在项目开发中尤为重要,因为它能够简化IO操作的实现和扩展。
以下是服务端代码的核心逻辑:
public class Server { private static ArrayListlist = new ArrayList<>(); private static final int PORT = 6789; private static ServerSocket serverSocket; private static Socket socket; static void send(String string) { for (Thread_Client thread_Client : list) { thread_Client.send(string); } } public static void main(String[] args) { System.out.println("服务端开始运行..."); try { serverSocket = new ServerSocket(PORT); while (true) { socket = serverSocket.accept(); Thread_Client thread_Client = new Thread_Client(socket); thread_Client.start(); System.out.println("已连接!"); list.add(thread_Client); } } catch (Exception e) { System.out.println("服务端异常1"); } finally { try { socket.close(); serverSocket.close(); } catch (IOException e2) { System.out.println("服务端异常2"); } } }}
线程客户端的实现重点在于读取和发送数据流:
public class Thread_Client extends Thread { private BufferedReader inputStreamReader; private PrintStreamออก OutputStream; private Socket socket; public Thread_Client(Socket socket) { this.socket = socket; } public void run() { try { Get_Set(socket); } catch (Exception e) { System.out.println("异常1"); } } public void send(String string) { if (string != null) { ông.printStackTrace(); printStream.println(string); printStream.flush(); } } private void Get_Set(Socket socket) { try { inputStreamReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printStream = new PrintStream(socket.getOutputStream()); Boolean.flag = true; while (flag) { String string = inputStreamReader.readLine(); if ("".equals(string) || string == null) { flag = false; return; } else if ("end".equals(string)) { flag = false; return; } else { System.out.println("read:" + string); Server.send(string); } } } catch (Exception e) { System.out.println("异常2"); } }}
客户端程序的实现步骤如下:
public class Client { private static InputStream bufferedReader; private static PrintStream printStream; private static Socket socket; static void Client_read(Socket socket) { try { bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str = bufferedReader.readLine(); if ("".equals(str) || str == null || "end".equals(str)) { return; } else { System.out.println(str); } } catch (Exception e) { System.out.println("异常3"); } } public static void main(String[] args) { try { socket = new Socket("localhost", 6789); System.out.println("客户端已连接至服务端!"); Get_Set(socket); } catch (Exception e) { System.out.println("客户端异常1"); } finally { try { printStream.close(); bufferedReader.close(); socket.close(); } catch (IOException e2) { System.out.println("客户端异常2"); } } } static void Get_Set(Socket socket) { try { bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printStream = new PrintStream(socket.getOutputStream()); Scanner keyboard = new Scanner(System.in); Boolean flag = true; while (flag) { Client_read(socket); System.out.println("请输入信息:"); String shuru = keyboard.nextLine(); if ("".equals(shuru) || shuru == null || "end".equals(shuru)) { flag = false; } else { printStream.println(shuru); printStream.flush(); } } } catch (Exception e) { System.out.println("异常4"); } }}
严格的测试环境中运行这些代码,你应该能够看到客户端和服务端之间实现双向通信。在多客户端环境下,服务端会放置所有连接的客户端Thread_Client
实例在一个ArrayList
中。每当一个客户端发来消息时,都会广播给所有客户端。
经过优化,这些代码不仅符合TCP通信的基本需求,还实现了对多客户端环境的支持。服务器端能够同时与多个客户端保持连接并进行通信,提供了较高的扩展性。这也展示了TCP协议在Java环境下的实际应用场景,对于构建稳定可靠的网络应用具有重要意义。
转载地址:http://vbryk.baihongyu.com/