博客
关于我
JAVA-Socket通信笔记
阅读量:793 次
发布时间:2023-01-27

本文共 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环境下的实际应用场景,对于构建稳定可靠的网络应用具有重要意义。

转载地址:http://vbryk.baihongyu.com/

你可能感兴趣的文章
CentOS 7 巨大变动之 systemd 取代 SysV的Init
查看>>
Centos 7 快速安装FTP服务
查看>>
centos 7 静态IP,指定DNS
查看>>
centos 7.3 启动mysql_centos7.3 搭建MySQL
查看>>
Centos 7.5 docker 容器怎么设置开机自启
查看>>
Centos 7.5 SSH改别的端口连接不上,只有默认端口才行(未解决)
查看>>
Centos 7.5 如何安装VMware Tools工具
查看>>
Centos 7.5 新磁盘创建和挂载XFS文件系统
查看>>
Centos 7.5安装safe-rm,防止rm -rf /命令误删除文件
查看>>
CentOS 7.X 系统安装及优化
查看>>
Centos 7下安装php+mysql+nginx+wordpress教程新版
查看>>
CentOS 7之Postfix部署系列 (一) CentOS安装
查看>>
flask框架面向移动端的虚拟物品订购平台毕设源码+论文
查看>>
flask框架飞机订票管理系统(毕设源码+论文)
查看>>
flask框架餐饮管理系统毕设源码+论文
查看>>
flask框架高性能教学资源平台设计与实现(毕设源码+论文)
查看>>
flask框架高校助学及勤工俭学管理系统(毕设源码+论文)
查看>>
flask框架高校图书管理系统设计与实现(毕设源码+论文)
查看>>
flask框架高校招生预报管理系统(毕设源码+论文)
查看>>
flask框架高校教师个人数字档案(毕设源码+论文)
查看>>