JAVA-Socket通信笔记
发布日期:2025-04-01 09:06:56 浏览次数:11 分类:精选文章

本文共 5156 字,大约阅读时间需要 17 分钟。

TCP协议的Java支持是一个非常重要的主题,特别是在实现基于TCP/IP协议的网络通信时。默认TCP协议提供了流套接字,而UDP协议提供了数据报套接字。流套接字基于TCP协议,其特点是面向连接,能够确保数据包的可靠传输,适合需要稳定通信的场景。TCP协议的强度显著低于UDP,因此在需要可靠性和有序通信的业务场景下更为理想。

在Java中,TCP通信主要通过ServerSocketSocket类来实现。ServerSocket用于初始化服务器端的套接字,监听特定的端口是否有客户端连接。服务器程序可以重复调用accept()方法来获取客户端连接,并创建相应的Socket实例。与此同时,服务器套接字也会为每次连接启动一个新的线程,负责与客户端进行通信。这些线程共享服务器的输入输出流,在数据传输完成后,通过close()方法关闭相应的连接。

在客户端程序中,类似地,通过创建Socket实例并连接到服务器端的指定端口来建立连接。客户端和服务器端的Socket实例通过输入输出流进行数据交换。为了方便处理,可以使用BufferedReader包装输入流,使用PrintStream包装输出流,从而实现便捷的数据读写操作。这一点在项目开发中尤为重要,因为它能够简化IO操作的实现和扩展。

以下是服务端代码的核心逻辑:

public class Server {    private static ArrayList
list = 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环境下的实际应用场景,对于构建稳定可靠的网络应用具有重要意义。

上一篇:java-web-j2e学习建议路线
下一篇:Java-slf4j:sfl4j

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年05月06日 22时39分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章