网络编程-TCP

news/2024/9/25 17:19:26/

一、TCP的相关IP

1.1 SeverSocket

这是Socket类,对应到网卡,但是这个类只能给服务器使用.

1.2 Socket

对应到网卡,既可以给服务器使用,又可以给客户端使用.

TCP是面向字节流的,传输的基本单位是字节.

TCP是有连接的,和打电话一样,需要客户端拨号,服务器来听.

服务器的内核会配合客户端这边的工作,来完成连接的建立.

这个连接建立的过程,就相当于电话这边在拨号,另外一边就在响铃.

但是需要等待用户点击了接听,才能进行后续通信.

内核建立的连接不是决定性的,还需要用户程序,把这个程序进行 "接听"/ accept 操作,然后才能进行后续的通信.

accept也是一个可能会产生阻塞的操作,如果当前没有客户端连过来,此时accept就会阻塞.

有一个客户端连过来了,accept一次就能返回一次

有若干个客户端连过来了,accept就需要执行多次.

二、实现TCP回显服务器

2.1 服务器代码

private ServerSocket serverSocket = null;public TcpEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动");ExecutorService pool = Executors.newCachedThreadPool();while(true){Socket clientSocket = serverSocket.accept();//Thread t = new Thread(()->{//    processConnection(clientsocket);//});//t.start();pool.submit(new Runnable() {@Overridepublic void run() {try {processConnection(clientSocket);} catch (IOException e) {throw new RuntimeException(e);}}});}}private void processConnection(Socket clientSocket) throws IOException {System.out.printf("[%s:%d] 客户端上线!\n",clientSocket.getInetAddress(),clientSocket.getPort());try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()){while(true){Scanner scanner = new Scanner(inputStream);if(!scanner.hasNext()){System.out.printf("[%s:%d] 客户端下线",clientSocket.getInetAddress(),clientSocket.getPort());break;}String resquest = scanner.next();String response = process(resquest);PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println(response);printWriter.flush();System.out.printf("[%s;%d] req: %s,resp: %s\n",clientSocket.getInetAddress(),clientSocket.getPort(),resquest,response);}} catch (IOException e) {throw new RuntimeException(e);}finally {clientSocket.close();}}public String process(String request){return request;}public static void main(String[] args) throws IOException {TcpEchoServer sever = new TcpEchoServer(9090);sever.start();}

2.2 客户端代码

private Socket socket = null;public TcpEchoClient(String severIp,int severPort) throws IOException {socket = new Socket(severIp,severPort);}public void start(){System.out.println("客户端启动");try(InputStream inputStream =socket.getInputStream();OutputStream outputStream = socket.getOutputStream()) {Scanner scannerConsole = new Scanner(System.in);Scanner scannerNetwoek = new Scanner(inputStream);PrintWriter writer = new PrintWriter(outputStream);while(true){//1.从控制台读取字符System.out.println("->");if(!scannerConsole.hasNext()){break;}String request = scannerConsole.next();//2.把请求发给服务器writer.println(request);writer.flush();//3.从服务器读取响应String response = scannerNetwoek.next();//4.把响应打印出来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",9090);client.start();}


http://www.ppmy.cn/news/1463120.html

相关文章

国产数据库TiDB简介

TiDB是一款由PingCAP公司自主设计、研发的开源分布式关系型数据库。以下是对TiDB的详细介绍: 一、基本特性 开源与兼容性:TiDB是开源的,并且高度兼容MySQL 5.7协议和MySQL生态,这意味着用户可以无缝地将现有MySQL应用迁移到TiDB…

集中抄表电表是什么?

1.集中抄表电表:简述 集中抄表电表,又称为远程抄表系统,是一种现代化电力计量技术,为提升电力行业的经营效率和客户服务质量。它通过自动化的形式,取代了传统人工抄水表,完成了数据信息实时、精确、高效率…

力扣:92. 反转链表 II(Java)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的…

Java开发大厂面试第17讲:MySQL 的优化方案有哪些?数据库设计、查询优化、索引优化、硬件和配置优化等

性能优化&#xff08;Optimize&#xff09;指的是在保证系统正确性的前提下&#xff0c;能够更快速响应请求的一种手段。而且有些性能问题&#xff0c;比如慢查询等&#xff0c;如果积累到一定的程度或者是遇到急速上升的并发请求之后&#xff0c;会导致严重的后果&#xff0c;…

【机器学习数据可视化-07】波士顿房价预测数据分析

波士顿房价预测&#xff1a;基于数据可视化的深入探索 一、引言   在当今社会&#xff0c;房地产市场作为经济的重要支柱之一&#xff0c;其走势与波动直接影响着国家经济的稳定和人民生活的品质。波士顿&#xff0c;这座历史悠久且充满活力的城市&#xff0c;其房地产市场一…

找到完美配色:Adobe Color替代的顶级配色网站

突出和协调的配色是设计的重要组成部分之一。对于设计师来说&#xff0c;如果他们没有系统地学习配色&#xff0c;他们可能对颜色的感知很弱&#xff0c;在配色时往往不知所措。Adobe Color可以轻松创建和共享颜色主题&#xff0c;并应用于项目中&#xff0c;也可以从灵感图像中…

小红书-社区搜索部 (NLP、CV算法实习生) 一面面经

&#x1f604; 整个流程按如下问题展开&#xff0c;用时60min左右面试官人挺好&#xff0c;前半部分问问题&#xff0c;后半部分coding一道题。 各位有什么问题可以直接评论区留言&#xff0c;24小时内必回信息&#xff0c;放心~ 文章目录 1、自我介绍2、介绍下项目&#xff…

MapReduce基础实战

**MapReduce基础实战** 一、引言 随着大数据时代的到来&#xff0c;数据量的快速增长对数据处理能力提出了更高的要求。MapReduce作为一种分布式计算框架&#xff0c;以其高效、容错和易于编程的特点&#xff0c;成为了处理大规模数据集的重要工具。本文将介绍MapReduce的基本…