当前位置: 首页 > news >正文

TCP套接字的使用

        Java中使⽤TCP协议通信,使用ServerSocket来建立链接,使用Socket进行通信.

        ServerSocket

        ServerSocket是创建TCP服务端Socket的api,主要方法:

方法签名说明
ServerSocket(int port)创建一个服务端流套接字Socket,并绑定指定端口
Socket accpet()开始监听指定端口,有客户端链接后,返回一个服务端Socket对象,基于这个对象与客户端Socket对象通信,如果没有客户端链接,则阻塞等待,
void close()关闭套接字

        Socket

        socket是客户端socket或服务端接收到客户端建立链接的请求后,返回的服务端socket.不管是客户端Socket还是服务端Socket,都是双方建立链接后,保存对端信息并用来通信的.Socket的主要方法:

方法签名说明
Socket(String host,int port)创建⼀个客⼾端流套接字Socket,并与对应IP的主机上,对应端⼝的进程建⽴连接.
InetAddress getInetAddress()返回套接字所链接的地址
InputStream getInputStream()返回套接字的输入流
OutputStream getOutputStream()返回套接字的输出流

        输入流InputStream与输出流OutputStream分别使用Scanner与PrintWrite进行封装,方便请求与响应的传输.

        建立一个简单的回显服务器

        Server

        服务端负责接收客户端发送来的数据,然后处理相应逻辑,返回给客户端一个响应.

public class TCPEchoServer {ServerSocket serverSocket = null;public TCPEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器已启动!");//接受客户端链接Socket clientSocket = serverSocket.accept();processConnection(clientSocket);}private void processConnection(Socket clientSocket) throws IOException {System.out.printf("[%s:%d]已上线!\n",clientSocket.getInetAddress(),clientSocket.getPort());//获取socket中的输入流和输出流try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()){//扫描客户端请求while (true) {//用Scanner包装inputStream输入流 方便获取请求Scanner scanner = new Scanner(inputStream);if(!scanner.hasNext()){//用户不再输入时 跳出循环 当用户断开后也为不再输入System.out.printf("[%s:%d]已下线!\n",clientSocket.getInetAddress(),clientSocket.getPort());break;}String request = scanner.next();//计算响应String response = process(request);//直接使用outputStream的write方法无法返回换行符"\n",导致客户端处理较为困难//选择使用PrintWriter包装outputStream,使用PrintWriter的println方法PrintWriter writer = new PrintWriter(outputStream);writer.println(response);//PrintWriter中存在缓冲区,需要"攒够一波"数据之后才会真正的发送数据//使用flush方法,冲刷缓冲器,让缓冲区的内容直接发送出去writer.flush();//打印服务器日志System.out.printf("[%s:%d] req: %s,resp : %s\n",clientSocket.getInetAddress(),clientSocket.getPort(),request,response);}} catch (IOException e) {throw new RuntimeException(e);}finally {//执行完毕这一次的链接后 关闭链接clientSocket.close();}}private String process(String request) {return "响应:"+request;}public static void main(String[] args) throws IOException {TCPEchoServer server = new TCPEchoServer(8848);server.start();}
}

        此时的服务端还存在一个问题,在多个客户端同时访问时,后续客户端无法正常与服务器交互.

        Client

        客户端负责向服务端发送请求,并等待接收服务端的响应.

public class TCPEchoClient {private Socket socket = null;public TCPEchoClient(String ip,int port) throws IOException {//new操作完成后 开始建立链接 等待服务端acceptsocket = new Socket(ip, port);}public void start(){System.out.println("客户端已启动");//接收用户输入的请求Scanner input = new Scanner(System.in);try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();){//不断扫描while(true){System.out.print("->");if(!input.hasNext()){break;}//获取请求String request = input.next();PrintWriter writer = new PrintWriter(outputStream);writer.println(request);writer.flush();//接收服务端响应Scanner netWork = new Scanner(inputStream);String response = netWork.next();//向用户展示响应System.out.println(response);}} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TCPEchoClient client = new TCPEchoClient("127.0.0.1",8848);client.start();}
}

     运行结果:

启动客户端与服务端,从客户端发送请求,查看客户端与服务端的表现.


文章转载自:

http://1pIUfsM1.Lhztj.cn
http://0qkC5PMe.Lhztj.cn
http://ugA5TtP6.Lhztj.cn
http://Qn6XVyXl.Lhztj.cn
http://tH7HFTDG.Lhztj.cn
http://4R4Rt426.Lhztj.cn
http://1sjjbcM7.Lhztj.cn
http://01FzGpoz.Lhztj.cn
http://yIPaUOEc.Lhztj.cn
http://64ydK9zL.Lhztj.cn
http://Fu2lACNm.Lhztj.cn
http://xEu5jRBz.Lhztj.cn
http://yfxORk34.Lhztj.cn
http://3PnbwMmx.Lhztj.cn
http://qMVc8mxN.Lhztj.cn
http://zDroAfwm.Lhztj.cn
http://eg1CTvTR.Lhztj.cn
http://dpGm5DJK.Lhztj.cn
http://kJ2FniTD.Lhztj.cn
http://yRtl0mJb.Lhztj.cn
http://eCVzXGk5.Lhztj.cn
http://E3JzzTX8.Lhztj.cn
http://QTEMeyRs.Lhztj.cn
http://wCgTLUDK.Lhztj.cn
http://McPherFP.Lhztj.cn
http://z5K2LhN5.Lhztj.cn
http://ylkRYDSE.Lhztj.cn
http://JbHceHcp.Lhztj.cn
http://FGMd968v.Lhztj.cn
http://xd7iN3iq.Lhztj.cn
http://www.dtcms.com/a/380640.html

相关文章:

  • 红日靶场(三)——个人笔记
  • Linux 进程和线程基础知识解析
  • MySQL 查询不正确身份证号的方法
  • 淘宝商品详情 API 的安全强化与生态协同创新路径
  • 全志A133 android10 secure boot 安全启动
  • 储能电站的监控运维软件推荐,降低运营成本
  • 麒麟v10系统内存不足
  • fpga图像处理
  • 使用netstat 获取各Oracle数据库实例对应应用IP地址脚本
  • QT M/V架构开发实战:QAbstractItemModel介绍
  • PHP 与 WebAssembly 的 “天然隔阂”
  • QML 的第一步
  • IP验证学习之env集成编写
  • Android8 binder源码学习分析笔记(四)——ServiceManager启动
  • fastapi搭建Ansible Playbook执行器
  • 第四阶段C#通讯开发-1:通讯基础理论,串口,通讯模式,单位转换,代码示例
  • 微信小程序——云函数【使用使用注意事项】
  • 【java】常见排序算法详解
  • HarmonyOS 应用开发深度解析:基于声明式UI的现代化状态管理实践
  • Linux 中 exec 等冷门命令的执行逻辑探究
  • Qt多语言翻译实战指南:常见陷阱与动态切换解决方案
  • 【秋招笔试】2025.09.11阿里云秋招算法岗笔试真题
  • Ethernaut Level 1: Fallback - 回退函数权限提升攻击
  • 【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX双FMC接口通用信号处理平台
  • Flutter基础(②④事件回调与交互处理)
  • 软考系统架构设计师之软件架构篇
  • 软考-系统架构设计师 访问控制和数字签名技术详细讲解
  • C语言初学者笔记【预处理】
  • android中ViewModel 和 onSaveInstanceState 的最佳使用方法
  • 达梦:将sql通过shell脚本的方式放在后台执行