2023年7月15日发(作者:)
javasocke客户端异常断开连接后重连发送不了消息_Java之⽹络编程⽹络编程在学习Java的⽹络编程前,我们需要知道⼀些关于⽹络编程的知识。对于⽹络编程,其实质是计算机之间的数据交换,也就是通信。⽽实现这种交换/通信我们需要有以下两个要素:1、⽹络通信协议2、IP和端⼝号那么这两个到底是什么呢?接下来我们简单来看看:⽹络通信协议⽹络通信协议就是计算机进⾏通信之前我们提前制定好的数据传送格式【会打包成⼀个数据包】,如果不按照这种格式来,那么就会传输失败。⽽今天我们学的是TCP/IP协议(传输控制协议/⽹际协议),【注:TCP/IP协议⼀定程度上参考了ISO体系,有兴趣的读者可以⾃⾏了解】这个协议是⽹络中最基本的协议,它定义了计算机如何连接因特⽹,以及数据如何在他们之间传输的标准。它的内部包含⼀系列的⽤于处理数据通信的协议,并被划分为4层:应⽤层,传输层,⽹络层,链路层。我们在Java程序中主要涉及到传输层,⾥⾯主要有两个我们要编程的内容:TCP协议和UDP协议。TCP协议⽤户传输协议,这是⼀种⾯向连接的协议。 当⼀台计算机向另⼀台计算机请求连接时【以下请求连接的计算机称为客户端,⽽被请求连接的计算机称为服务端】,需要经过三次握⼿。⽽当要断开连接时,需要经历四次挥⼿。怎么理解三次握⼿和四次挥⼿呢?我们简单的看下⾯的图:⼤概的流程图我们简化为⽇常的通话来⽅便理解。三次握⼿,第⼀次是客户端向服务器发出连接请求(图中的我去找你,你在哪),第⼆次是服务器响应客户端的请求(图中的我在xxx),第三次是客户端收到服务端响应,向服务器发送确认信息(图中的马上到),以此来连接。⽽四次挥⼿原理类似,就不再阐述。这种协议的好处是保证了数据的安全。等下与UDP对⽐就能体现了。UDP协议⽤户数据包协议,这是⼀种⽆连接的协议,省略了TCP那些繁琐的步骤,所以耗资⼩、效率较⾼。但是就是也是因为⽆连接,所以可能会造成数据丢失。(接下来编写代码之后就能够看的⼀清⼆楚了)IP和端⼝号以上我们知道了两台计算机连接的协议,有了协议,没有⽬的地也是没⽤的,⽽IP和端⼝号就是⽤来表⽰⽬的地的【如果把IP地址表⽰具体到⼩区/村等的地址,那么端⼝号就相当于门牌号】。IP地址互联⽹协议地址,每⼀台电脑都有属于⾃⼰的IP地址,对于IP地址,我们有以下的分类:1、IPv4,以.分开,由四个字段组成,每⼀个字段的范围为0~2552、IPv6,以:分开,由⼋个字段组成,每⼀个字段以⼗六进制表⽰。我们可以通过cmd命令中的ipconfig来查看IP地址,其中,以太⽹适配器中的IPv4地址和IPv6就是本机的IP地址:注:这⾥的IPv6地址的表⽰是以0位压缩表⽰法来表⽰的。⽽当我们连接⽹络后,在⽹络中也有⼀个IP地址:前者是接⼊⽹线分配的IP地址,后者是接⼊WIFI分配的IP地址。⽽对于WIFI分配的IP地址,⼀般都是的格式。【后⾯的代码实现就是基于同⼀个WIFI下/局域⽹实现通信的】端⼝⼀个端⼝⽤来表⽰计算机上的⼀个进程,但这个端⼝和PID【cmd的⼀些常⽤的动词性命令、⽹络命令简单提过】是不⼀样的,如果简单理解的话,PID主要对内的,⽽端⼝是对外的。怎么理解呢?当你每在计算机上运⾏⼀个程序时,计算机都会给这个程序分配⼀个PID,每次打开程序所分配的PID⼀般是不⼀样的【cmd动词性命令taskkill中可以看出】,⽽端⼝主要是让外部来识别的,所以⼀般都是⼀个程序对应⼀个端⼝。⽽且端⼝不像PID有多种⽅法可以直接看到,需要使⽤软件来查看。端⼝号由两个字节组成,在0~65535之间,⽽且需要注意的是,⼀般1024前的端⼝号都已经被系统占⽤了:端⼝的分类:1、公有端⼝0~1023:HTTP:80HTTPS:443FTP:21TELENT:232、程序注册端⼝1024~49151:TOMCAT:8080MySQL:3306Oracle:15213、动态/私有端⼝49152~66535把上述的⼏个概念弄明⽩之后,我们就可以学习Java中相对应的类来进⾏编程了。我们先看看所需要的类,这些类都位于包下:InetAddress类:这个类没有构造⽅法,我们⼀般⽤这个类来获取⼀些东西:其中常⽤的⽅法有:通过以上的⽅法还有⼀个"127.0.0.1"或者"localhost"表⽰本机地址,我们就有以下⼏种获取本机ip的⽅法:Socket类:主要⽤到的有两个:常⽤的⽅法有:ServerSocket类:常⽤的构造⽅法是第⼆个。⽽常⽤的⽅法有:DatagramSocket类:常⽤的构造⽅法是第三个,⽽常⽤的⽅法有:DatagramPacket类:常⽤的构造⽅法是第三个和第四个。以上就是等下需要⽤到的类,看起来复杂,但其实实质也是离不开IO流。并且以上的host参数可以看成是IP地址,⽽port看成是端⼝,于是我们的编程就简单了。接下来我们来看下TCP和UDP的简单实现:TCP通信
实现TCP通信主要就是⽤到Socket类和ServerSocket类。⽽Socket类主要就是⽤来做客户端的,ServerSocket类主要⽤来做服务端的,从以上的⽅法中我们可以知道Socket的发出信息和接收信息都是依靠IO流的,⽽ServerSocket中没有返回IO流有关的⽅法,那怎么接收发出消息呢?答案是⽤accept⽅法来返回⼀个Socket类,接下来的接收发出就和Socket⼀样了。我们先建⽴⼀个服务端的类【由于atch太繁琐,这⾥的异常先直接抛出】:再创建⼀个客户端的类:之后就可以运⾏了,运⾏结果如下:注意,在TCP通信中⼀定要先启动服务端,再启动客户端进⾏通信,这⾥就体现了需要连接了。否则如果只运⾏客户端的话客户端会报错:⽽如果只运⾏服务端的话,服务端就会在accept那⾏代码中进⼊堵塞状态,直到有客户端请求连接。以上的代码是不是有⼀半都是IO流的内容,所以作者这⾥就不再详细解释了,只要会创建ServerSocket和Socket类,获取IO流来进⾏发送接收,TCP通信的简单实现就完成了。UDP通信
UDP涉及到的类就是DatagramSocket和DatagramPacket两个类了,我们接收或者发送数据包的时候只需要把数据传⼊DatagramPacket类中,然后使⽤DatagramSocket的send或者receive⽅法进⾏发送或者接收就可以了。以下看⼀个简单的代码实现:服务端:客户端:⽼规矩,先运⾏服务端,会发现如果客户端没有发送的话,也会进⼊等待状态。⽽运⾏客户端后:这时候⼀个简单的UDP通信就实现了。可以发现,如果我们只运⾏客户端,没有运⾏服务端。也不会报错。因为UDP没有连接的限制,客户端只管发送,不管对⽅有没有收到。⽽服务端要接收到客户端发送的信息必须要早与客户端运⾏才⾏。因此可能会数据丢失的原因就在这体现出来了。修改版我们根据UDP的这种特性,就可以把它修改成⼀个简单的聊天软件,代码如下:服务端:客户端:运⾏之后结果如下:对于以上的例⼦,都是在同⼀台计算机操作的,如果读者想在两台计算机尝试通信的话也是很简单的。只需要保证两台电脑在同⼀个局域⽹/WIFI中,并且如果是进⾏TCP/UDP通信的话,作为服务端的计算机需要把防⽕墙暂时关闭。之后⽤ipconfig看在局域⽹的IP地址,填到对应的位置上。这⾥就不演⽰了。关闭防⽕墙(命令):这⾥还推荐⼀个⽅法来看客户端的电脑能否与服务端进⾏连接:ping命令,直接在cmd窗⼝中输⼊ping 服务端的IP地址 如果是如下情况:就说明与服务端的计算机连接不了,需要关闭防⽕墙。如果关闭防⽕墙,并且其他东西都没问题,那么应该会出现下⾯的界⾯,这样就表⽰可以连接了:最后⼀点,因为每运⾏⼀次上述的Java程序,那个程序就会占⽤指定端⼝,如果没有关闭,重复运⾏的话程序可能会报错。所以建议每次不⽤的时候停⽌程序运⾏。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689409852a243485.html
评论列表(0条)