目录
📕 引言
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即可
整体代码:
客户端与上述一样,不在展示。
运行: