欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 实现简单Socket 通信的示例

程序员文章站 2022-07-01 16:31:15
java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层。本文介绍了 java socket 简单用法。1. 传输层协议传输层包含了两种协议,分别是 tcp (tra...

java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层。本文介绍了 java socket 简单用法。

1. 传输层协议

传输层包含了两种协议,分别是 tcp (transmission control protocol,传输控制协议) 和 udp (user datagram protocol,用户数据报协议)。

tcp 是一种面向连接,可靠的流协议。通信双方在“发送-接收”数据之前需要先建立 tcp 连接,然后通过互相发送二进制数据流来进行通信。所谓连接,指的是各种设备、线路,或网络中进行通信的应用程序为了相互传递消息而建立的专有、虚拟的通信线路。连接一旦建立,进行通信的应用程序只使用该虚拟的通信线路发送和接收数据。tcp 还需要处理端到端之间的流量控制。

udp 是一种无连接的,不可靠的数据报协议。发送方不需要与接收方建立连接,通信双方通过发送一个个独立的数据报来进行通讯。

tcp 通过序列号、确认应答、数据校验等机制确保了传输的可靠性,适用于需要可靠数据传输的场景,应用层协议 http,ftp 基于 tcp。udp 没有复杂的控制机制,不纠错,不重发,不保证数据的准确性,不确保数据到达目的地;不过 udp 传送等量数据花费更小的流量,适用于对时延要求高但对准确性要求不高的场景,如视频、音频通讯。

java 中有 3 种套接字类,java.net.socket 和 java.net.serversocket 基于 tcp,java.net.datagramsocket 基于 udp。

2. tcp 示例

tcp 是面向连接的,所以在进行通讯之前发送端(客户端)需要先连接到接收端(服务端)。客户端通过 new socket("localhost", 9090) 来创建一个连接到服务端的套接字,这个套接字连接到主机 localhost 的 9090 端口。

serversocket 实现服务端套接字,通过 new serversocket(9090) 来创建一个监听端口为 9090 实例;serversocket.accept() 方法会阻塞等待客户端的连接,一旦有连接过来,会返回一个服务端的 socket 实例。连接建立完成,客户端 socket 实例和服务端 socket 实例就可以面向输入输出流发送数据了。

2.1 示例效果

客户端程序接收控制台输入的内容,客户端控制台每输入一行,就往服务端发送,服务端接收到消息之后,将消息打印到控制台。

客户端输入 "bye" 时,客户端断开与服务端的连接,客户端程序退出,服务端程序继续等待连接。

客户端控制台输入输出:

服务端控制台输出:

2.2 服务端程序代码

3. udp 示例

udp 不需要连接,客户端与服务端通过发送数据报来完成通信。java 中使用 java.net.datagramsocket 来表示 udp 客户端或服务端的套接字,使用 java.net.datagrampacket 来表示 udp 的数据报。客户端和服务端可以直接向对方发送数据报,不需要进行连接。

下面代码基于 udp 实现了与上面程序同样的功能。不过消息可能会出错,某些消息可能也不能到达服务端。

3.1 服务端程序代码

3.2 客户端程序代码

需要注意的是,udp 是面向无连接的,但 datagramsocket 的 api 中提供了带有 connect 字样的方法,这里的 connect 并非 tcp 中连接的意思。而是指定了当前的 udp 套接字只能够向指定的主机和端口发送数据报。

以上就是java 实现简单socket 通信的示例的详细内容,更多关于java 实现socket 通信的资料请关注其它相关文章!