【JavaEE初阶】UDP客户端和服务器的搭建

avatar
作者
筋斗云
阅读量:0

目录

📕 引言

🌲DatagramSocket API

🎄DatagramPacket API

🍀InetSocketAddress API

🎍回显客户端与服务器

🚩建立回显服务器

🚩建立回显客户端

🚩 服务器-客户端运行

🎋翻译小助手服务器与客户端的简单建立


📕 引言

socket api都是系统提供的(不同系统提供的api不一样),Java中对于系统提供的api又进一步的封装了。

🌲DatagramSocket API

网络编程, 本质上是要操作网卡.

但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡.

因此进行网络通信, 势必需要先有一个 socket 对象.

DatagramSocket 是UDP Socket,用于发送和接收UDP数据报

DatagramSocket 构造方法

DatagramSocket 方法

注意:receive(DatagramPacket p)此处的参数,也是输出型参数,也就意味着说在调用receive的时候,先要构造出一个空的DatagramPacket对象,传到receive中,再由receive内部往这个参数中填充数据。在前面讲述文件操作的read是类似的效果。

🎄DatagramPacket API

DatagramPacket是UDP Socket发送和接收的数据报

DatagramPacket 构造方法

这个就相当于你去食堂吃饭需要拿个盘子装饭一样,这个就是拿来装数据报的

DatagramSocket也提供了以下几种方法供我们使用

DatagramPacket 方法

构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创建。

🍀InetSocketAddress API

InetSocketAddress ( SocketAddress 的子类 )构造方法:

🎍回显客户端与服务器

什么叫回显客户端与与服务器呢?

其实就是:客户端向服务端发送请求,一般来说我们的服务端会对我们发送的请求进行处理,我们这里为了简单,就省略里面的处理过程,只实现将请求重新发回客户端,不做任何处理。

🚩建立回显服务器

我们大致可以分为以下几步:

  • 创建一个类,为UdpEchoServer,来表示我们的UDP 版本的回显服务器

  • 创建一个socket对象,来操作网卡(通过成员来创建)

  • 在UdpEchoServe类的构造方法里对socket对象进行构造(以便异常处理和指定参数)

  • 建立start()方法用于启动我们的服务器

  • 由于我们的服务器需要不停处理请求,不停的返回响应,所以我们设计一个死循环

  • 构造好个空白的 DatagramPacket 对象. 交给 receive 来进行填充

  • DatagramPacket 是一个特殊的对象, 里面存储的是二进制数据,Java并不方便直接进行处理. 所以把这里包含的数据拿出来, 构造成一个字符串.

  • 创建一个process()方法,这个方法就表示 “根据请求计算响应”

  • 把响应写回到客户端. send 的参数也是 DatagramPacket. 需要把这个 Packet 对象构造好.此处构造的响应对象, 不能是用空的字节数组构造了, 而是要使用响应数据来构造

注意:

  • 我们加一个打印一下,当前这次请求响应的处理中间结果.

  • 最后我们创建main()函数进行启动服务器

整体代码:

注意:当程序启动之后,代码执行到receive的时候,如果没有客户端发送请求,服务器的代码就会在这里阻塞(跟锁关系不大,这里的阻塞都是系统内核控制的),直到说有客户端发来请求。

运行程序:                                   通过jconsole查看:

上述代码有两段不同获取数据的长度,他们的区别:

🚩建立回显客户端

我们分为以下几步:

  • 创建一个类,为UdpEchoClient,来表示我们的UDP 版本的回显服务器

  • 创建一个socket对象,来操作网卡(通过成员来创建)

  • 在UdpEchoServe类的构造方法里对socket对象进行构造(以便异常处理和指定参数)

  • 上述构造方法还不行,需要定义两个变量,后序要从客户端把数据报发给目的服务器,要明确出目的服务器的ip和端口号。那么两个遍历,一个表示服务器的IP地址,一个表示端口号

  • 客户端都是需要通过额外的途径直到服务器ip和端口是啥,因此服务器的ip和端口得是固定的,不能老变

注意:为什么在服务器中构造socket对象的时候,是带有端口号参数版本的构造方法;在客户端中构造socket对象的时候,是不带端口号参数版本的构造方法。

  • 创建start方法,构造请求,发送请求,接收请求响应,打印响应。
  • 发送请求:构造请求数据报的时候,不光要传输数据,还要有传给谁(服务器的ip,port)!

  • 读取服务器的 UDP 响应, 并解析,构造好个空白的 DatagramPacket 对象. 交给 receive 来进行填充

  • 把解析好的结果显示出来.

整体代码:

运行:

🚩 服务器-客户端运行

注意:必须先要启动服务器,在启动客户端!!!

启动服务器:                              启动客户端:

输入之后的运行结果:

客户端:                                                        服务器:

服务器可给多个客户端提供服务:

当我们再次运行客户端时,会提示你需要停掉之前启动的客户端,所以idea在默认情况下只能启动一个客户端。可以设置运行多个客户端。

步骤:

1.                                                                      2.

3.

4.

5.当前窗口就会多出一个这样的提示,点击ok即可。

 运行多个客户端:

每个客户端都能与服务器进行通信。

客户端输入:

服务器:

注意:当前客户端和服务器是在同一个电脑上,不同电脑是否可行?

🎋翻译小助手服务器与客户端的简单建立

创建一个UdpDictServer服务器,由于上述写的服务器和UdpDictServer所要实现的内容绝大部分是一样的,只有process不一样,所以可以直接继承UdpEchoServer,重写process方法即可。

这里报错的原因是在父类中的process是private修饰的,子类不能访问,改成public即可

整体代码:

客户端与上述一样,不在展示。

运行:

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!