Java网络通信-Socket初探
Posted Qtest之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java网络通信-Socket初探相关的知识,希望对你有一定的参考价值。
在互联网时代,我们开发和使用的应用可能都成为网络延伸的一部分,这就要求我们对网络编程知识有些基本的了解。最初作为网络编程语言面世的Java,对网络编程提供了高度的支持。而在网络编程中Socket的使用最为广泛,比如我们熟知的即时通讯软件都使用了Socket相关技术。笔者在参与三剑客接口测试平台(http://sanjianke.corp.qihoo.net/)的开发中因为平台有对外提供服务的需要,解决用户内网与三剑客通信的问题而深挖了该技术,所以今天就给大家简单介绍socket在Java里面的使用和一些注意事项。
![Java网络通信-Socket初探](https://image.cha138.com/20210425/b4b2896d91444afe83941365ac5575e2.jpg)
什么是socket? 首先我们知道在网络四层模型中最上面两层分别是应用层和传输层,而我们可以把socket看作是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用。如下图所示:
![Java网络通信-Socket初探](https://image.cha138.com/20210425/c7c9b6ccd3c3473b87b26808d33795c8.jpg)
建立Socket的三要素: 协议,IP和端口。Java 对使用TCP还是UDP连接做了封装,分别使用Serversocket和DatagramSocket即可。建立一个socket连接的代码调用非常简单,如下分别为服务端和客户端的示例:
![Java网络通信-Socket初探](https://image.cha138.com/20210425/6e67fe35111d4cd99c86938cb27b63e4.jpg)
上面的server端代码在执行第一行时就会尝试绑定并监听指定的端口号,如果该端口号已被其它应用使用就会返回错误。执行第二行的accept方法会一直阻塞,直到监听到有新的客户端连接,返回相应的socket句柄。无论是server还是client,在拿到socket句柄之后就可以进行一些读写操作,与操作文件读写类似,如:
![Java网络通信-Socket初探](https://image.cha138.com/20210425/85968bfc75e04009a4610a4c342dc684.jpg)
如何监听socket连接的状态? 使用socket对象提供的isConnected()方法获得的值总是true,即使实际上连接已经断开了,所以这个方法不能达到我们的目的。但是我们可以通过发心跳包的方式来监听连接是否正常。Java里面sokect对象可以使用sendUrgentData(int data)方法来发送一个字节的数据(int参数的低八位)。需要注意的是在接收心跳数据的一方(可以是server或者client)需要做如下设置:
![Java网络通信-Socket初探](https://image.cha138.com/20210425/cb6e1888f0a4454d97c06ee2bd07cdcb.jpg)
同时需要在接收端对发送过来的心跳数据做处理,一般是直接舍弃或忽略。
如何实现与多客户端之间的通信? 这个其实是用多线程技术能实现,大体的步骤如下:
![Java网络通信-Socket初探](https://image.cha138.com/20210425/627809886ceb4166bf982115e23fa01a.jpg)
使用socket进行UDP通信。 我们知道与稳定可靠的TCP连接不同,UDP是无连接的、不可靠的、无序的,但是速度快。在用socket进行UDP编程时,需要用到两个主要的类: DatagramSocket 和 DatagramPacket, 后者用来创建数据包,大小限制在64K以内。具体可参考以下简单示例:
![Java网络通信-Socket初探](https://image.cha138.com/20210425/eb11716d2f7f43db848121690e6a2cd1.jpg)
![Java网络通信-Socket初探](https://image.cha138.com/20210425/62f3a211611a4ec88bff1ca383cb1ef1.jpg)
如各位读者所见,在Java中使用Socket通信并不复杂,简单几行代码就能完成连接的建立。但实际应用时我们还有一些值得注意的点,比如输入输出流的关闭,多线程数量和优先级的控制等等。
Qtest之道
以上是关于Java网络通信-Socket初探的主要内容,如果未能解决你的问题,请参考以下文章