Java网络编程

系列文章目录

TCP和UDP编程、三次握手,四次挥手的过程。URL、URI,计算机网络基础。

一、基础知识了解

通信三要素:ip地址,端口号,通信协议

1.ip地址

IPv4:32位,点分4段法

IPv6:128位,冒分十六进制表示法

ipconfig:查看本机的ip地址

ping ip:检查网络是否连通

特殊的ip地址:127.0.0.1,回送地址,代表本机地址

2.端口号

端口号用来标记正在计算机设备上运行的应用程序,其范围是0~65535。

熟知的端口号:mysql:3306,ftp:20,21,http:80,tomcat:8080,redis:6379,Oracle:1521。

3.通信协议

TCP和UDP这样的,不同设备之间连接和通信的规则叫做通信协议。

OSI图表详解:

二、三次握手,四次挥手

TCP中三次握手和四次挥手用于客户端和服务器端的连接和断开。

1.三次握手

刚开始的时候,客户端和服务端都处于Closed状态,客户端主动向服务端发送,服务端处于Listen状态

第一次握手:客户端向服务器发送连接请求,SYN (同步)= 1,seq = x;此时客户端处于SYN_SENT(同步已发送)状态。

第二次握手:服务器接收到客户端发来的请求报文,如果同意连接,向客户端发送确认信息,ACK = 1,seq = y,SYN = 1,ack = y+1,此时服务器处于SYN_RCVD(同步已接收)状态

第三次握手:客户端接收到服务器端发来的确认信息,再次向服务器发送确认连接,ACK=1,seq = x+1,ack = y+1;此时三次握手结束,建立连接。

2.四次挥手

用于断开连接,初始时客户端和服务器都出去ESTABLISHED状态

第一次挥手:客户端向服务器发送释放连接请求,只有报文头,FIN = 1,seq = u(客户端向服务器发送的最后一个字节的序号),此时客户端处于FIN-WAIT-1(终止等待1)状态。

第二次挥手:服务器收到客户端发来的连接释放报文后,发送确认信息,ACK = 1,seq = v,ack = u+1,此时服务器进入CLOSE-WAIT(关闭等待)状态。

第三次挥手:客户端收到服务器的确认报文,进入FIN-WAIT2(终止等待2)状态,等待服务器发送连接释放报文,此时服务器会将最后的数据处理完毕,向客户端发送连接释放报文,FIN = 1,ACK = 1,seq =w,ack = u+1,服务器进入LAST-ACK(最后确认)状态。

第四次挥手:客户端收到服务器的连接释放报文,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成。

3.为什么不是两次握手或者四次握手?

不是两次握手的原因:如果只有两次握手,客户端发送连接请求后,服务端收到并确认就进入连接状态。但如果客户端的请求在网络中延迟,客户端超时重发请求,服务端收到后建立连接,而此时客户端的第一次请求到达服务端,服务端会认为是新的连接请求并进入连接状态等待数据,而客户端早已认为连接失败不再发送数据,这样就会浪费服务端的连接资源。
不是四次握手的原因:三次握手已经能够满足可靠建立连接的需求,四次握手相对冗余,会降低连接建立的效率。

4.为什么四次挥手要等待2MSL时间?

主要原因是为了保证客户端发送那个的第一个ACK报文能到到服务器,因为这个ACK报文可能丢失,并且2MSL是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃,这样新的连接中不会出现旧连接的请求报文。

三、TCP

TCP:传输控制协议,面向连接的通信协议,比较可靠的,无差错的数据传输

服务端:创建ServerSocket对象,需要传一个端口号,然后调用accept()方法,会进入阻塞,如果有客户端连接,立马返回一个套接字对象Socket。

客户端:创建套接字对象Socekt,传入IP地址和端口号进行初始化。

套接字的方法:getInputStream,getOutputStream

如果是想一个服务器多个客户端可以使用多线程,再服务器端接收到一个套接字对象就开一个线程。

多人聊天室:服务器开接收一个客户端开一个线程,服务器端,同时要开一个线程去不断接收消息。

四、UDP

UDP:用户数据报协议,无连接通信协议,通信效率高,不能保证数据传输的完整性。

java.net.DatagramSocket:负责接收和发送数据

java.net.DatagramPacket:负责封装要发送的数据和接收到的数据。

打包和发送的方法:

socket.send(packet)

socket.reveive(packet)

对于接收来说:

socket = new DatagramSocket(port)

packet = new DatagramPacket(buf, 0,buf.length);

socket.reveive(packet)

对于发送来说:

socket = new DatagramSocket()

packet = new DatagramPacket(buf, 0,buf.length,InetAddress.getByName(ip), port);

socket.send(packet)

五、URL类

统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示。

URL由四部分组成:协议,存放资源的主机域名、端口号、资源文件名

URL标准格式 <协议>://<域名/IP>:<端口>/<路径>

常用方法:

获取协议:url.getProtocol(),获取域名:url.getHost(),获取默认端口:url.getDefaultPort(),

获取路径:url.getPath(),获取资源:url.getFile(),获取数据:url.getQuery(),

获取锚点:url.geRef()。

使用URL类中的openStream()方法可以打开此时URL连接并返回一个用于连接读入的InputStream,实现最简单的网络爬虫。

六、URI

URI:统一资源标志符

URL:统一资源定位符

URN:统一资源名称

七、InetAddress类

用来封装计算机的IP地址和DNS(域名),包括一个主机名和IP地址

常用静态方法:

InetAddress.getLocalHost():获取本机的IP地址和主机名的封装对象

InetAddress.getByName():通过域名来获取对象

常用实例方法:

getHostAddress():获取本机的IP地址

getHostName():获取本机的主机名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值