Java网络通信-Socket初探

Posted Qtest之道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java网络通信-Socket初探相关的知识,希望对你有一定的参考价值。

在互联网时代,我们开发和使用的应用可能都成为网络延伸的一部分,这就要求我们对网络编程知识有些基本的了解。最初作为网络编程语言面世的Java,对网络编程提供了高度的支持。而在网络编程中Socket的使用最为广泛,比如我们熟知的即时通讯软件都使用了Socket相关技术。笔者在参与三剑客接口测试平台(http://sanjianke.corp.qihoo.net/)的开发中因为平台有对外提供服务的需要,解决用户内网与三剑客通信的问题而深挖了该技术,所以今天就给大家简单介绍socket在Java里面的使用和一些注意事项。

Java网络通信-Socket初探

什么是socket? 首先我们知道在网络四层模型中最上面两层分别是应用层和传输层,而我们可以把socket看作是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用。如下图所示:

Java网络通信-Socket初探

建立Socket的三要素: 协议,IP和端口。Java 对使用TCP还是UDP连接做了封装,分别使用Serversocket和DatagramSocket即可。建立一个socket连接的代码调用非常简单,如下分别为服务端和客户端的示例:

Java网络通信-Socket初探

上面的server端代码在执行第一行时就会尝试绑定并监听指定的端口号,如果该端口号已被其它应用使用就会返回错误。执行第二行的accept方法会一直阻塞,直到监听到有新的客户端连接,返回相应的socket句柄。无论是server还是client,在拿到socket句柄之后就可以进行一些读写操作,与操作文件读写类似,如:

Java网络通信-Socket初探

如何监听socket连接的状态? 使用socket对象提供的isConnected()方法获得的值总是true,即使实际上连接已经断开了,所以这个方法不能达到我们的目的。但是我们可以通过发心跳包的方式来监听连接是否正常。Java里面sokect对象可以使用sendUrgentData(int data)方法来发送一个字节的数据(int参数的低八位)。需要注意的是在接收心跳数据的一方(可以是server或者client)需要做如下设置:

Java网络通信-Socket初探

同时需要在接收端对发送过来的心跳数据做处理,一般是直接舍弃或忽略。

如何实现与多客户端之间的通信? 这个其实是用多线程技术能实现,大体的步骤如下:

Java网络通信-Socket初探

使用socket进行UDP通信。 我们知道与稳定可靠的TCP连接不同,UDP是无连接的、不可靠的、无序的,但是速度快。在用socket进行UDP编程时,需要用到两个主要的类: DatagramSocket 和 DatagramPacket, 后者用来创建数据包,大小限制在64K以内。具体可参考以下简单示例:

Java网络通信-Socket初探
Java网络通信-Socket初探

如各位读者所见,在Java中使用Socket通信并不复杂,简单几行代码就能完成连接的建立。但实际应用时我们还有一些值得注意的点,比如输入输出流的关闭,多线程数量和优先级的控制等等。


Qtest之道




以上是关于Java网络通信-Socket初探的主要内容,如果未能解决你的问题,请参考以下文章

Socket网络编程初探

[python]初探socket

初探webService

Pythonsocket 编程初探

C# Socket初探

初探java I/O 工作机制