<JavaEE> 基于 TCP 的 Socket 通信模型

目录

一、认识相关API

1)ServerSocket

2)Socket

二、TCP字节流套接字通信模型概述

三、回显客户端-服务器

1)服务器代码

2)客户端代码


一、认识相关API

1)ServerSocket

|------------------------|----------------------------------------|
| ServerSocket 常用构造方法 ||
| ServerSocket(int port) | 创建使用TCP协议的Scoket套接字,绑定本机指定端口(通常用于服务器)。 |

|-----------------|-----------------------------------------------------------------------------|
| ServerSocket 常用方法 ||
| Socket accept() | 开始监听指定端口(端口在创建时绑定)。没有客户端连接时就阻塞,有客户端连接就返回一个服务端的Socket对象,并基于该Socket建立与客户端的连接。 |
| void close() | 关闭ServerSocket套接字。 |

2)Socket

|-------------------------------|----------------------------------------|
| Socket 常用构造方法 ||
| Socket(String host, int port) | 创建一个客户端流套接字Socket,并与对应的主机上的对应端口进程建立连接。 |

|--------------------------------|---------------|
| Socket 常用方法 ||
| InetAddress getInetAddress() | 返回套接字连接的对端地址。 |
| int getPort() | 返回套接字连接的对端端口。 |
| InetAddress getLocalAddress() | 返回套接字连接的本地地址。 |
| int getLocalPort() | 返回套接字连接的本地端口。 |
| InputStream getInputStream() | 返回该套接字的输入流。 |
| OutputStream getOutputStream() | 返回该套接字的输出流。 |
| void close() | 关闭Socket套接字。 |


二、TCP字节流套接字通信模型概述

|-------------------------------------------------------------------------------------------------------|
| TCP协议具有有连接,面向字节流的特征。在通信之初,通信双方会先建立连接,并保存对端信息。通信连接的建立由系统内核完成,不需要代码干预。 |
| TCP通信,使用ServerSocket类在服务端创建TCPSocket,并获取与客户端的连接。使用Socket类分别在客户端和服务端保存对端信息,并用于与对端的数据交互。 |
| TCP通信流程:服务端客户端建立连接 -> 客户端构造请求->发出请求 -> 服务器接收请求->解析请求->处理请求->构造响应->返回响应->客户端接收响应->解析响应->处理响应 |


三、回显客户端-服务器

1)服务器代码

java 复制代码
public class TCP_Echo_Server {
    private ServerSocket serverSocket = null;

    public TCP_Echo_Server(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        //创建线程池;
        ExecutorService executorService = Executors.newCachedThreadPool();
        while (true){
            //获得连接;
            Socket socket = serverSocket.accept();
            //添加任务,每获得一个连接就使用一个线程去执行accpetConnection方法;
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    accpetConnection(socket);
                }
            });
        }
    }

    private void accpetConnection(Socket socket){
        System.out.printf("客户端上线:[%s,%d]\n",socket.getInetAddress(),socket.getPort());
        //TCP传输的是字节流,创建两个流对象用于获得Socket的输入流和输出流;
        try(InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream()){

            //使用Scanner在流中读取并翻译字节;
            Scanner sc = new Scanner(is);

            //用于将获取到的输出流封装成PrintWriter;
            PrintWriter printWriter = new PrintWriter(os);

            while (true){
                //判断如果没有后续数据了,就退出;
                if (!sc.hasNext()){
                    System.out.printf("客户端下线:[%s,%d]\n",socket.getInetAddress(),socket.getPort());
                    break;
                }

                //获得请求;
                String request = sc.next();
                //构造响应;
                String response = process(request);

                //将响应写入Socket的输出流中;
                printWriter.println(response);
                //刷新缓冲区,确保响应及时发送;
                printWriter.flush();

                //打印日志;
                System.out.printf("[%s,%d] req=%s res=%s\n",
                        socket.getInetAddress(),socket.getPort(),request,response);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭Socket文件资源;
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        TCP_Echo_Server server = new TCP_Echo_Server(9090);
        server.start();
    }
}

2)客户端代码

java 复制代码
public class TCP_Echo_Client {
    private Socket clientSocket = null;

    public TCP_Echo_Client(String serverIP,int serverport) throws IOException {
        //根据指定的服务器地址和端口号构建客户端套接字;
        clientSocket = new Socket(serverIP,serverport);
    }

    public void start(){
        System.out.println("成功连接!");
        //TCP传输的是字节流,创建两个流对象用于获得Socket的输入流和输出流;
        try(InputStream is = clientSocket.getInputStream();
            OutputStream os = clientSocket.getOutputStream();){

            //创建两个Scanner对象,分别用于从控制台输入请求和从输入流获得响应;
            Scanner ossc = new Scanner(System.in);
            Scanner issc = new Scanner(is);

            //用于将输出流封装成PrintWriter;
            PrintWriter printWriter = new PrintWriter(os);

            while (true){
                //输入请求;
                System.out.print("->");
                String request = ossc.next();

                //构造请求的字节流,并写入Socket的输出流中
                printWriter.println(request);
                //刷新缓冲区,确保请求及时发送;
                printWriter.flush();

                //获取响应;
                String response = issc.next();
                //打印响应;
                System.out.println(response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        TCP_Echo_Client client = new TCP_Echo_Client("127.0.0.1",9090);
        client.start();
    }
}

阅读指针 -> 《 协议格式 -- 传输层协议 UDP 》

<JavaEE> 协议格式 -- 传输层协议 UDP-CSDN博客介绍了传输层协议UDP的协议格式https://blog.csdn.net/zzy734437202/article/details/135185783

相关推荐
智慧光迅AINOPOL12 小时前
校园在线巡课系统方案:督导全覆盖
网络·全光网解决方案·全光网·校园全光网·校园全光网解决方案
酉鬼女又兒13 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
Urbano13 小时前
工装制作全流程科普:从面料到自动化生产
网络·人工智能
2401_8685347813 小时前
网规笔记 | 真题解析:2018年11月软考网规-网络安全案例分析
网络
Gauss松鼠会14 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
超级无敌zhq14 小时前
后渗透痕迹清理:攻防对抗中的隐身术
网络·数据库·网络安全
摇滚侠14 小时前
JavaSE 和 JavaEE 是什么意思
java·java-ee
“初生”14 小时前
Codex 桌面端新会话 5 次 Reconnecting 怎么办?HTTP/SSE 完美修复方案(2026最新)
网络·网络协议·http
m0_7381207214 小时前
Docker 环境下 Vulfocus 靶场搭建全流程(附镜像源问题解决方案)
运维·服务器·网络·安全·docker·容器
爱讲故事的15 小时前
计算机网络第七章:无线与移动网络复习笔记
网络·笔记·计算机网络