TCP的socket的API

devtools/2024/9/22 6:58:14/
关键的两个类
1)ServerSocket

该类专门给服务器用的,这个构造方法传入端口进行连接

accept相当于是接听操作,进行连接

close关闭当前套接字,当socket对象与进程的生命周期不一致时需要提前释放资源,就需要调用close

为什么UDP的客户端服务器中没有这个close方法,因为这个socket的生命周期是与进程一样的,只要服务器运行这,socket就不能释放,当进程结束的时候,持有的资源都会全部释放,包括占有的内存和文件描述符表

2)Socket

客户端和服务器都要用,TCP传输的是字节流,就是传输字节

根据上述的构造方法,创立一个socket对象就能够和服务器建立连接,相当于拨号操作

这个方法可以获取到socket内部的流对象,通过InputStream,OutputStream进行read和write操作对网卡进行操作

获取到对应的端口号和IP地址

等待客户端发送请求,服务器与客户端建立连接之后,返回一个socket对象,如果没有客户端发送请求就会阻塞 

TCP处理连接中接收请求的当遇到空白符的时候才会读取完毕,使用这个scanner直接收到的就是字符串,如果使用inputstream的read()方法还需要将字节转化为字符串,客户端在发送请求的时候,必须在每个请求的末尾加上空白符,这个要求是程序员之间通信细节的约定,TCP是按照字节的方式来进行传输的,实际上我们希望若干个字节能构成一个应用层的数据报,区分一个应用层的数据报就是通过空白符来进行分割

空白符是一类统称,空格,换行回车,制表符,翻页符...

响应也加一个空白符,这样就能区分出一个完整的响应,一个请求对应一个响应,因为这是TCP传输的普遍问题,发请求和返回响应都需要考虑分隔符

阻塞等待请求的到达,1)请求到了有明确的分隔符返回true,2)TCP连接断开了返回false

当单独启动服务器没有启动客户端时,会在accept处产生阻塞,

当启动客户端之后服务器便会解除阻塞接收客户端发来的请求

当结束客户端时,会在服务器程序控制台打印客户端下线,当强制结束客户端进程时,或者调用socket.close()方法时,操作系统内核就会感知到,从而TCP断开连接流程(触发四次挥手)

代码案例

客户端

服务器

上述代码还存在一定问题

1) clientSocket没有关闭,会不断浪费文件描述符表,在客户端返回请求会false的时候将对象进行close方法关闭,但是如果其他地方出现异常就无法关闭,所以在finally中写入close方法是最稳妥的

2)当前服务器只能给一个客户端提供服务,无法给多个客户端提供服务,第二个客户端启动发送请求就会发送阻塞,第一个客户端下线之后服务器可以立马感知到第二个客户端上线并且发送请求

修改方法:

 由于主线程接收到客户端的连接之后变为客户端提供服务,这是在主线程中处理连接并未第一个客户端提供服务所以第二个客户端会阻塞等待,这是单线程,此时运用多线程的知识,每接收到一个客户端的连接,创建一个新线程在新线程中执行处理连接客户端任务,此时主线程的任务是与客户端建立连接,t线程的任务是为客户端提供服务,使服务器能为多个客户端提供服务

还可以通过线程池的方式来进行创建线程

问题解决了,两个服务器,两个不同的端口

上述通过线程池不断创建线程可能回到系统创建的线程太多,承受不住从而使电脑死机,我们的解决方法是IO多路复用和分布式系统

关于IO多路复用

IO多路复用使用一个线程同时管理多个socket对象,这些socket对象往往不会同时有数据需要处理,而是同一时刻,只有很少的socket需要处理数据,这个IO多路复用,是操作系统内核为我们提供的,我们直接使用api即可,

在Java中提供了NIO这样的类:大致方法流程创建一个NIO类的对象去管理socket对象,添加回调,等到socket可读的时候,调用回调函数来进行处理

实现的TCP翻译服务器

技术要点

1)重写process方法,处理请求的方法加上一个'\n'表示空白符,能够判断出到哪里是一个完整的请求,这是TCP的需要注意到事项

2)翻译的数据结果是HashMap

3)通过继承父类TcpEchoServer


http://www.ppmy.cn/devtools/85081.html

相关文章

【动态规划】力扣.213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一…

Python应用开发——30天学习Streamlit Python包进行APP的构建(20):配置

Configuration配置 config.toml config.toml 是一个可选文件,你可以为工作目录或全局开发环境定义它。当 config.toml 文件同时在全局和工作目录中定义时,Streamlit 会合并配置选项,并优先使用工作目录配置。此外,你还可以使用环境变量和命令行选项来覆盖其他配置选项。更…

React系列面试题

大家好,我是有用就点赞,有用就扩散。 1.React的组件间通信都有哪些形式? 父传子:在React中,父组件调用子组件时可以将要传递给子组件的数据添加在子组件的属性中,在子组件中通过props属性进行接收。这个就…

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)即将召开!

2024第八届自然语言处理与信息检索国际会议 (NLPIR 2024)将于2024年12月13-15日在日本冈山的冈山大学举行。NLPIR 2024将为自然语言处理与信息检索领域的专家学者提供一个交流与合作的平台,推动该领域的学术进步和技术创新。同时,本次会议也将为相关企业…

PHP框架中的数据加密实践:确保数据安全的艺术

引言 数据加密是保护敏感信息不被未授权访问的关键技术。在PHP框架中实现数据加密不仅可以增强应用的安全性,也是遵守数据保护法规的必要措施。本文将深入探讨在PHP框架中实现数据加密的方法,包括加密算法的选择、密钥管理、以及如何在应用程序中集成加…

Vue的安装配置

1.安装node js Node.js — 在任何地方运行 JavaScript (nodejs.org) 2.测试nodejs是否安装成功 node -v npm -v3.通过npm 安装 vue npm install -g vue/cli4.测试vue是否安装成功 vue --version5.打开PyCharm,创建项目:flask-web vue create flask…

星环科技携手东华软件推出一表通报送联合解决方案

随着国家金融监督管理总局“一表通”试点工作的持续推进,星环科技携手东华软件推出了基于星环科技分布式分析型数据库ArgoDB和大数据基础平台TDH的一表通报送联合解决方案,并已在多地实施落地中得到充分验证。 星环科技与东华软件作为战略合作伙伴&…

【HarmonyOS学习】用户文件访问

概述 文件所有者为登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为,需要提前获取用户授权,或由用户操作完成。 用户文件访问框架 是一套提供给开发者访问和管理用户文件的基础框…