当前位置:网站首页>接地气讲解TCP协议和网络程序设计
接地气讲解TCP协议和网络程序设计
2022-08-01 23:57:00 【油墨香^_^】
1、
TCP接地气解释
TCP协议大家应该了解过吧,中文意思就是传输控制协议。
教科书的理解是这样的,它提供两台计算机之间可靠的数据传送,可以保证数据从一端发送到另一端接收时,数据能准确送达(那就是可靠的意思),而且抵达的数据的排列顺序和送出的顺序相同。教科书果然是教科书啊,听了半天,啥也没懂。

听一下网友的接地气的解释吧。TCP协议就像打电话,A给B打电话,B肯定要先接通电话才能听到A的讲话,这样就能够可靠地把A说的话听清楚,是一对一的关系。这够接地气了吧。这是TCP协议与UDP协议的对比,关于UDP协议下一篇文章解释。


2、
两个概念(端口和套接字)
端口:一台计算机只有一个连接到网络的物理端口(就是网线接口),一个端口怎么可能够用呢,明显会撞车,所以呢这个物理端口负责接收或者发送数据,而网络程序设计中的端口并非真实存在的,只是假想出来的连接装置。端口被规定为一个0 ~ 65535之间的整数,0 ~ 1023有其他用途,我们不能用了,所以写程序用的端口一定要在1024以上。
套接字(Socket)这个一听就不知道是什么鬼东西,教材解释是用于将应用程序与端口连接起来。还不懂是吧?那就正常啦。其实我们可以这样想,把网络比喻成电路或者电网,把端口比喻成插座,那套接字毫无疑问就是插头了,它跟端口一连接网络就通了,就像插头一插就通电了,其实就是在程序和网络之间起到桥梁的作用,这比喻够形象了吧,还不够的话上图。

知道有这个东西存在之后,那怎么用呢?在用之前我们要懂得一个原理(如下图1),两台计算机之间通信是要有一端是服务器,一端是客户端(用户),所以呢套接字也会分服务器套接字(ServerSocket)和客户端套接字(Socket),来看一下各自都有哪些方法可以用:
ServerSocket的用法:
ServerSocket server =new ServerSocket(1100);
参数只有一个,就是指定那一个端口,以下是它的方法,调用accept()方法待客户端连接成功后会返回一个Socket对象,这个Socket对象就可以跟客户端的Socket进行通信,具体是通过输入流和输出流来完成通信。比如,服务器的Socket对象使用getOutputStream()方法获取输出流,然后客户端的Socket对象使用getInputStream()获得输入流,这样就完成了服务器向客户端发送消息的功能,反之亦然。

Socket的用法:
Socket client =new Socket("192.168.1.1",1100);
第一个参数是要连接的服务器主机ip地址,第二个参数是端口。

3、
实战
看了这么多理论,是时候来实战一下了,看一个很简单的程序,我会详细讲解这个程序。因为需要一个服务器和客户端,所以我打开了两个eclipse,这里为了省空间,我把导入包的操作都省略了。先来看服务器端:
public class TCP {public static void main(String[] args) {try {ServerSocket server =new ServerSocket(1100);//创建服务器套接字System.out.println("服务器启动成功,等待用户接入....");Socket client=server.accept(); //返回一个Socket对象System.out.println("有用户接入,客户端ip是:"+client.getInetAddress());//获取连接服务器的客户端//获取一个输入流,接受客户端发来的消息InputStream in=client.getInputStream();//获取字节输入流byte bt[]=new byte[1024];//接收到的是字节流,所以先定义一个字节数组。int len=in.read(bt);//从输入流中读取读取字节到字节数组,这个方法会返回一个int值,表示读到的字节长度。//把字节数组作为参数创建字符串对象并输出,输出的字节从0到最后一个字节,就是把读到的内容都输出出来。System.out.println("客户端发来的消息:"+new String(bt,0,len));OutputStream out=client.getOutputStream();//获取一个输出流,向客户机发信息String message="你好,我是服务器";out.write(message.getBytes());//因为输出流是字节流,所以这里把字符串转换为字节形式client.close();//关闭服务器套接字} catch (IOException e) {e.printStackTrace();//捕捉异常}}}
具体语句的功能我写到了注释中了,首先是创建一个服务器套接字,它会与服务器的端口连接并等待用户连接,如果此时有客户端连接该服务器,则会在服务器端返回一个Socket套接字,这个时候就完成连接工作了,剩下的就是发送消息了。发送过程具体看注释。我们再来看一下客户端的:
public class TCP {public static void main(String[] args) {try {Socket client=new Socket("172.16.176.72",1100);System.out.println("连接服务器成功");OutputStream out=client.getOutputStream();String message="你好,我是客户端";out.write(message.getBytes());InputStream in=client.getInputStream();byte bt[]=new byte[1024];int len=in.read(bt);System.out.println("服务器发来的消息:"+new String(bt,0,len));client.close();//关闭客户端套接字} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
客户端的代码就比较简单了,直接输入ip地址和端口就可以连上服务器了,然后通过输入输出流就可以发送消息了,来看一下效果图:

这里需要注意的一点,服务器端的accept()方法会阻塞线程的进行,换句话说就是如果没有客户端连接它会一直等待,后面的语句不会执行,知道连接上为止,就是下面两句。
Socket client=server.accept(); //返回一个Socket对象
System.out.println("有用户接入,客户端ip是:"+client.getInetAddress());//获取连接服务器的客户端
TCP协议搞定。这里给大家支个招,怎么查看电脑的软件占用了那些端口呢?如果之前运行程序可以,后来又不行,很可能就是端口被占用了。在命令行输入:netstat -an (有空格!!)
之前一直听说TCP协议,今天总算解开它的面纱了!
边栏推荐
- CDH6 Hue to open a "ASCII" codec can 't encode characters
- 1个月写900多条用例,二线城市年薪33W+的测试经理能有多卷?
- Axure教程-新手入门基础(小白强烈推荐!!!)
- contentEditable属性
- 【Leetcode】479. Largest Palindrome Product
- 在CentOS下安装MySQL
- color transparency parameter
- 多御安全浏览器android版更新至1.7,改进加密协议
- 【三子棋】C语言实现简易三子棋
- 在MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password YES) 拒绝访问问题解决
猜你喜欢

CDH6 Hue to open a "ASCII" codec can 't encode characters

很多人喜欢用多御安全浏览器,竟是因为这些原因

Artifact XXXwar exploded Artifact is being deployed, please wait...(已解决)

ICLR 2022 Best Paper: Partial Label Learning Based on Contrastive Disambiguation

Win10安装DBeaver连接MySQL8、导入和导出数据库详细教程

Docker实践经验:Docker 上部署 mysql8 主从复制

yay 报错 response decoding failed: invalid character ‘<‘ looking for beginning of value;

OpenCV DNN blogFromImage()详解

async和await用法介绍

【MySQL系列】MySQL数据库基础
随机推荐
Flink学习第四天——完成第一个Flink 流批一体案例
Unity—四元数、欧拉角API+坐标系统
获取小猪民宿(短租)数据
Cash Ⅱ LeetCode_518_ change
numpy.unique
路径压缩、、
如何用Redis实现分布式锁?
12306抢票,极限并发带来的思考?
SphereEx苗立尧:云原生架构下的Database Mesh研发实践
@WebServlet注解(Servlet注解)
如何优雅的消除系统重复代码
solidity
DOM 基础操作
【Leetcode】2360. Longest Cycle in a Graph
经典文献阅读之--DLO
Excel导入和导出
2022 6th Strong Net Cup Part WP
Study Notes: The Return of Machine Learning
Flink Yarn Per Job - CliFrontend
ansible模块--copy模块