我是靠谱客的博主 天真大白,最近开发中收集的这篇文章主要介绍java网络通信,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java已经将网络程序所需要的东西封装成不同的类,只要创建这些类的对象,使用相应的方法,就可以实现网络通信。

服务器-----------网络-----------客户机。服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,通常所说的“局域网”(local Area Network)LAN ,是一群通过一定形式连接起来的计算机,LAN延伸到更大的范围,这样的网络称为“广局网”(wide Area network)WAN ,人们熟悉的internet则是由无数的LAN和WAN组成。LAN是由特定类型的传输媒体(如电缆、光缆和无线媒体)和网络适配器(亦称为网卡)互连在一起的计算机,并受网络操作系统监控的网络系统。

网络协议:规定了计算机之间的物理,机械(网线与网卡的连接规定),电气(有效的电平范围)等特征以及计算机之间的相互寻址规则,数据发送冲突的解决,长的数据如何分段传送与接收,

1.IP协议:iternet protocol 的简称,由此可知它就是一种“网络协议”,internet网络采用的协议是TCP/IP协议。全称是Transmission control protocol / internet protocol,TCP:面向连接的传输层协议,IP:网路层协议。IP的工作是把原始数据(数据包)从一地传送到另一地;TCP的工作是管理这种流动并确保其数据是正确的。在internet网上存在数以亿计的主机,每一台主机在网络上通过为其分配的internet地址表示自己,这个地址就是IP地址,目前为止,IP地址用4个字节,也就是32位二级制数表示,称为IPv4.为了便于使用,通常取用每4个字节的十进制数并每个字节间用圆点隔开来表示(点分十进制)IP地址(网络号段+主机号段),如192.168.1.1.现在人们正在试验用16个字节来表示IP地址,这就是IPv6,但IPv6还没投入使用。Tcp/IP是一种层次结构,共分为4层(7层),分别为:应用层,传输层,互联网层,主机到网络层。

私有地址就是在互联网上不使用,而被用在局域网中的地址,B类的除了写出的是私有地址外,169.254.x.x是保留地址。

A类的可分配Ip的电脑数最大,目前中国可能只占3个。ipconfig是查IP地址的dos命令。ping 后面跟ip地址:测试本机与指定ip地址间的通讯是否有问题。特殊的ip地址:127.0.0.1 回环地址(表示本机)ping后也可以写这个。x.x.x.255 广播地址,x.x.x.0 网络地址。https://blog.csdn.net/chengonghao/article/details/51926274,这篇文章不错。InetAddress类,根据主机名或者IP地址的字符串表示得到IP地址对象,getHostName()方法获取主机名,getHostAddress获取ip地址。

2.TCP与UDP协议:在TCP/IP协议栈(是指网络中各层协议的总和)中,

应用层:我们手机中的软件,比如QQ。表示层:操作转换为二进制数据,加密解密在这里处理,会话层:对数据传输进行管理,会话层在两个互相通 信的应用进程之间,建立、组织和协调其交互(Interaction)。例如,确定是双工工作(每一方同时发送和接收), 还是半双工工作(每一方交替发送和接收)。当发生意外时(如已建立的连接突然断了),要确定在重新恢复会话时应从何处开始。传输层:数据传输的方式,网络层:这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。数据链路层:管理如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理,换句话说就是从物理层接受的数据进行MAC地址(网卡的地址)的封装与解封装,这一层的工作设备是交换机。物理层:定义物理设备的标准,如网线的接口类型,各种传输介质的传输速率,主要作用是传输比特流,(就是由1,0转化为电流(无线是电磁波)强弱来进行传输,到达目的地后转化为1,0也就是通常说的数模转换和模数转换,这一层的数据叫做比特)。简单的说,物理层确保原始的数据可在各种物理媒体上传输。

网络编程三要素:IP地址(区分电脑),端口(区分程序),协议(规则)

TCP(传输控制协议 Transmission Control Protocol)和UDP(用户数据报协议 User Datagram protocol)应该了解。TCP需要三次握手建立连接,四次断开来断开连接,效率低,保证数据送出顺序与抵达顺序相同,保证数据正确性,因此TCP协议更适合可靠性要求比较高的场合,例如HTTP从某个URL读取数据时,如果收到的数据顺序与发送时的顺序不同,可能会出现一个混乱的HTML文件或一些无效的信息。UDP是无连接通信协议,打包有限制,每个包大约64k,速度快不保证可靠数据的传输,UDP协议会把数据打包,然后扔给目标地址,但是这个包能不能扔的到目标机器上,就不管了,udp就只管扔。所以这种通信协议的优缺点很明显了,优点就是:速度快,效率高;缺点就是:安全性低,容易丢包。

长连接与短链接:

长连接意味着进行一次数据传输后,不关闭连接,长期保持联通状态,如果两个应用程序之间有心的数据需要传输,则直接服用这个连接,无需创建新的连接。它的优势在于多次通信中可以省去建立和关闭连接的开销,多次传输数据的总耗时更少,缺点是需要花费额外的经理保持这个连接一直是可用的,所以我们一般会通过下面这几种方式来做“保活”工作,确保连接在被使用的时候是可用状态:

1.利用 TCP 自身的保活(Keepalive)机制来实现,保活机制会定时发送探测报文来识别对方是否可达。一般的默认定时间隔是 2 小时,你可以根据自己的需要在操作系统层面去调整这个间隔,不管是 linux 还是 windows 系统。

2.上层应用主动的定时发送一个小数据包作为“心跳”,探测是否能成功送达到另外一端。 保活功能大多数情况下用于服务端探测客户端的场景,一旦识别客户端不可达,则断开连接,缓解服务端压力。

提前多说一句,如果在做了高可用的分布式系统场景中运用长连接会更麻烦一些。因为高可用必然包含自动故障转移、故障隔离等机制。这恰恰导致了一旦发生故障,客户端需要及时发现哪些连接已处于不可用状态,并进行相应的重连,包括重新做负载均衡等工作。

了解完了长连接,那么短连接就很容易理解了。短连接意味着每一次的数据传输都需要建立一个新的连接,用完再马上关闭它。下次再用的时候重新建立一个新的连接,如此反复。

它的优势是由于每次使用的连接都是新建的,所以基本上只要能够建立连接,数据就大概率能送达到对方。并且哪怕这次传输出现异常也不用担心影响后续新的数据传输,因为届时又是一个新的连接。缺点是每个连接都需要经过三次握手和四次握手的过程,耗时大大增加。

另外,短连接还有一个致命的缺点。我们回到前面提到的维基百科对 socket 的定义,其中说到 socket 包含通信协议、目标地址、状态等。实际当你在基于 socket 进行开发的时候,这些包含的具体资源主要就是这 5 个:源 IP、源端口、目的 IP、目的端口、协议,有个专业的叫法称之为“五元组”。在一台计算机上只要这五元组的值不重复,那么连接就可以被建立。然而一台计算机最多只能开启 65535 个端口,如果现在两个进程之间需要通信,作为服务端的 IP 和端口必然是固定的,因此单个客户端理论上最多只能与服务端同时建立 65535 个 socket 连接。如果除去操作系统和其它进程所占用的端口,实际还会更少。所以,一旦使用不当,在很短的时间内建立了大量连接,端口很容易被占用完。这不但会导致自身无法正常工作,还会影响到同一台计算机上的其它进程。

端口和套接字:一般而言,一台计算机只有单一的连接到网络的“物理连接(physical connection)”所有的数据都通过此连接对内,外送达特定计算机,这就是物理端口(网卡口)。而我们指的是逻辑端口,每个网络程序都会至少有一个逻辑端口,用于标识进程的逻辑地址,不同进程的标识,网络程序设计中的端口(prot)并非真实的物理存在,而是一个假象的连接装置,端口被规定为一个在0-65535之间的整数,HTTP服务一般使用80端口,FTP一般使用21端口,假如一台计算机提供了HTTP,FTP等多种服务,那么客机通过不同的端口来确定连接到服务器的哪项服务上,通常0-1023之间的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突(通过360可以查看端口号:更多--流量防火墙--网络连接)。网络中的套接字(socket)用于将应用程序与端口连接起来,套接字是一个假象的连接装置,就像插座,连接电线与电器,java将套接字抽象化为Socket类,socket之间通过IO传输。换句话说Socket用于描述ip地址和端口,是一个通信链的Handle。在Internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket就是为了网络编程提供的一种机制,通信的两端都有socket,网络通信其实就是socket间的通信,数据在两个socket之间通过 IO 传输。

ava,net包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址,主机地址等信息。此类会抛出UnknowHostException异常,这个异常在主机不存在或网络连接错误时发生。

TCP连接过程

如下图所示,可以看到建立一个TCP连接的过程为(三次握手的过程):

第一次握手

客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。

第二次握手

服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。

第三次握手

当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。

这里可能大家会有个疑惑:为什么 TCP 建立连接需要三次握手,而不是两次?这是因为这是为了防止出现失效的连接请求报文段被服务端接收的情况,从而产生错误。

TCP断开过程:

TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。

第一次握手

若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。

第二次握手

B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。

第三次握手

B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。

第四次握手

A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(MSL为报文最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。

TCP设计基础:1.服务器程序创建一个serverSocket(服务器端套接字),调用accept()方法等待客户机来连接。2.客户端程序创建一个socket,请求与服务器建立连接。3.服务器接收客户机的连接请求,同时创建一个新的socket与客户建立连接,服务器继续等待新的请求。

serverSocket类:java。net包中的serverSocket类用于表示服务器套接字,其主要功能是等待来自网络的“请求”,它可以通过指定的端口来等待连接的套接字,服务器套接字一次可以与一个套接字连接,如果多台客户机同时请求,服务器套接字会将请求连接的客户机存在队列中,然后依次连接,若请求数大于最大容量,则多出的请求被拒绝,队列大小默认50,下面backlog即为队列容量。

调用serverSocket类的accept()方法,如果有客户端连接,创建一个套接字socket,服务端和客户端都通过getoutputStream()获得输出流对象,getinputStream()方法获取输入流对象,

在结束运行时要关闭socket和reader。当一台机器上安装了多个网络应用程序,很可能指定的端口号已被占用,此时运行netstat - help来获得帮助,使用netstat -an来查看该程序所使用的端口,

//客户端 : new Socket 时创建流套接字并将其链接到指定的IP地址的指定端口

//服务端
    

UDP(用户数据报协议)

使用UDP时,用户无法知道数据能否正确的到达主机,也不能确定到达目的地顺序,但速度较快,模式:将数据打包,然后将数据包发往目的地。接收别人发来的包,然后查看数据包。

DatagramPacket类:java。net包内, 表示数据包,构造函数,DatagramPacket(byte[] buf, int lenght, InetAddress address, int port)制定了数据包的内存空间和大小,还有目标地址和端口。

DatagramSocket类:java。net包内,表示发送和接收数据包的套接字,构造函数:DatagramSocket(int port, inetAddress)创建数据抱套接字将其绑定到指定的本地地址和端口(适用于多块网卡和多个IP情况),如果没有参数那就是将套接字绑定到本地主机任何可用的端口。、

        // Sever端  如果多次启用接收端会报出bindexception端口被占用错误,如果第一次运行就报错说明已经有程序占这个端口。
       

 

最后

以上就是天真大白为你收集整理的java网络通信的全部内容,希望文章能够帮你解决java网络通信所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部