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

2023-12-24 15:12
文章标签 java tcp ee socket 通信模型

本文主要是介绍<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)服务器代码

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() {@Overridepublic 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)客户端代码

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();}
}

阅读指针 -> 《⽹络编程理论基础 -- TCP/IP协议体系》

链接生成中..........

这篇关于<JavaEE> 基于 TCP 的 Socket 通信模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532204

相关文章

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain