网站建设品牌公司哪家好,英文网站怎么做,网站类型分类,陕西省建设网官网首页前言
#x1f31f;#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~
#x1f308;感兴趣的小伙伴看一看小编主页#xff1a;GGBondlctrl-CSDN博客
#x1f525; 你的点赞就是小编不断更新的最大动力
#x1f386;那么废话不…
前言
本期讲解关于TCP/UDP协议的原理理解~~~
感兴趣的小伙伴看一看小编主页GGBondlctrl-CSDN博客 你的点赞就是小编不断更新的最大动力
那么废话不多说直接开整吧~~~ 目录
1.UDP的API使用
1.1DatagramSocket
1.2DatagramPacket
2.实现回显服务器
2.1概念
2.2服务器的操作过程
1.初始化服务器
2.读取请求并解析
3.根据请求实现响应
4.把响应返回给客户端
5.客户端的IP和端口号打印
6.主函数的实现
2.3客户端的操作过程
1.初始化客户端
2.控制台输入请求
3.构造请求并且发送
4.读取服务器的响应
5.主函数的实现
2.4回显服务器基本流程
2.5打印日志分析
3.总结 1.UDP的API使用
1.1DatagramSocket
这里负责对Socket进行读写借助网卡进行数据的读写操作
这里的初始化方法有以下几种
DatagramSocket()创建一个UDP数据报套接字Socket绑定到本机的随意的一个端口客户端DatagramSocket(int port)创建一个UDP数据报套接字Socket绑定到本机的指定的一个端口服务器 还包括实现那套接字的方法
receiveDatagramPacket p使用套接字实现数据的读取sendDatagramPacket p使用套接字实现数据的写入
注意这里的DatagramPacket就是一个输出型参数
1.2DatagramPacket 接着上面小编提到这里的DatagramPacket是一个输出型参数和前面实现文件IO的操作类似的这里的就是一个UDP数据报是接收和发送数据的基本单位
2.实现回显服务器
2.1概念
回显服务器相当于我们之前学习的输出hello world这里的回显服务器代表的是没有任何逻辑过程即客户端请求啥就直接响应啥
2.2服务器的操作过程
1.初始化服务器
代码如下
public class UDPServer {//构造方法private DatagramSocket socketnull;public UDPServer(int port) throws SocketException {//通过socket对网卡进行数据的操作socketnew DatagramSocket(port);}
注意
1.我们所有的对于网卡的操作就是借用这里的socket实现这里的port是一个端口号服务器是可控的所以这里就要指定一个端口号
2.抛出异常当端口号被一个进程占用了那么端口号就创建失败了一个端口号只能被一个进程占用但是一个进程可以占用多个端口号
2.读取请求并解析
代码如下
public void start() throws IOException {System.out.println(服务器启动!);while (true) {// 每次循环, 就是处理一个请求-响应过程.// 1. 读取请求并解析DatagramPacket requestPacket new DatagramPacket(new byte[4096], 4096);socket.receive(requestPacket);// 读到的字节数组, 转成 String 方便后续的逻辑处理.String request new String(requestPacket.getData(), 0, requestPacket.getLength());
注意
1.这里的死循环是为了表示服务器是24小时不间断的所以没有必要进行退出的操作
2.通过DatagramPacket设置保存这里的读取到的字节信息这是一个输出型参数
3.此时的receive就能读取到UDP数据报的的内容存放到requestPacket字节数组中并且这里还知道原IP端口是啥即数据从哪里来的
4.最后将这里的字节类型的数据转化为字符串类型的数据字节数组里不一定就是二进制的数据还可能是文本类型的数据使用string保存恰到好处
3.根据请求实现响应
代码如下 String response process(request);public String process(String request) {return request;}
注意
由于回显服务器是没有业务逻辑的所以在实现对应的响应的时候直接放回输出的请求即可
4.把响应返回给客户端
代码如下 // 3. 把响应返回到客户端.// 构造一个 DatagramPacket 作为响应对象DatagramPacket responsePacket new DatagramPacket(response.getBytes(), response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);
注意
1.这里的实现对于字符串的操作把string的字节数组给提取出来
2.这里还使用了socketAddress实现得到INetAddress对象包含了客户端的的IP和端口号即客户端的数据报
5.客户端的IP和端口号打印
代码如下 System.out.printf([%s:%d] req: %s, resp: %s\n, requestPacket.getAddress().toString(),requestPacket.getPort(), request, respond);
注意
这里代表的就是客户端的IP,端口号以及请求和响应
6.主函数的实现
代码如下
public static void main(String[] args) throws IOException {UDPServer udpServernew UDPServer(9090);udpServer.start();}
注意 这里的9090是我们程序员规定的服务器的端口号
2.3客户端的操作过程
1.初始化客户端
代码如下
public class UDPClient {private DatagramSocket socketnull;private String ServerIP;private int ServerPort;public UDPClient(String serverIP,int serverPort) throws SocketException {this.ServerIP serverIP;this.ServerPortserverPort;socketnew DatagramSocket();}
注意
这里要设置要请求的服务器的IP和端口号因为发起请求就是要知道服务器在哪里这里和上面日志的打印是一致的请求的IP是客户端的本机IP客户端是系统随机分配的
2.控制台输入请求
代码如下 public void start() throws IOException {System.out.println(客户端启动);Scanner scnew Scanner(System.in);while (true){System.out.println(-);if (!sc.hasNext()){break;}
注意
这里和服务器是一致的都是24小时不间断的这里的sc.hashnext是为了表示没有更多的的输入了那么就返回false去反后就跳出循环
3.构造请求并且发送
代码如下
String requestsc.next();DatagramPacket requestPacketnew DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(ServerIP),ServerPort);//来自哪里的信息socket.send(requestPacket);
注意
这里就是通过字符串转为字节数据并且指定发送的端口号和IP地址最后通过send进行发送数据请求服务器
4.读取服务器的响应
代码如下
// 4. 读取服务器的响应.DatagramPacket respondPacketnew DatagramPacket(new byte[1024],1024);socket.receive(respondPacket);String respondnew String(respondPacket.getData(),0,respondPacket.getLength());System.out.println(respond);
注意
这里就规定传输的数据单位通过接收服务器传来的响应保存到字节数组里面最后转为string字符串类型的数据在实现打印
5.主函数的实现
public static void main(String[] args) throws IOException {UDPClient udpClientnew UDPClient(127.0.0.1, 9090);udpClient.start();}
注意
这里的“127.0.0.1”是本机的IP地址9090是我们输入的服务器端口号
2.4回显服务器基本流程
如下图片的实现过程 小编这里由于宽度不够就无法完全分开请见谅~~~以上就是具体的实现过程
第一步服务器启动进入receive发现没有请求那么就直接进入阻塞
具体代码 DatagramPacket requestPacketnew DatagramPacket(new byte[1024],1024);//通过接收的方法进行数据的传入socket.receive(requestPacket); 第二步客户端进入循环执行到sc.hashnext进入阻塞知道用户输入内容
具体代码 System.out.println(-);if (!sc.hasNext()){break;}
第三步输入请求的内容转化为字节类型数据指定服务器IP和端口号发送请求
具体代码 String requestsc.next();DatagramPacket requestPacketnew DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(ServerIP),ServerPort);//来自哪里的信息socket.send(requestPacket);
第四步服务器解除阻塞读取DatagramRocket对象构造string需求根据需求执行响应操作最后返回构造响应对象并进行send发送的操作这个过程客户端阻塞
具体代码: String requestnew String(requestPacket.getData(),0,requestPacket.getLength());//注意这里的长度是字节的长度不是字符串的长度//进行响应的操作String respondprocess(request);//发送响应,转化为面向数据包的类型DatagramPacket respondPacketnew DatagramPacket(respond.getBytes(),respond.getBytes().length,requestPacket.getSocketAddress());//最后发送这个数据socket.send(respondPacket);
第五步客户端接收服务器传来的数据存储在字节数组中然后转化为字符串数据类型实现打印在控制台上
具体代码 DatagramPacket respondPacketnew DatagramPacket(new byte[1024],1024);socket.receive(respondPacket);String respondnew String(respondPacket.getData(),0,respondPacket.getLength());System.out.println(respond);
2.5打印日志分析
这里我们启动服务器和客户端后进行输入 这里我们就可以看到输出一个nihao那么就返回一个nihao那么我们可以看看服务器的打印日志
如下图 此时注意前面两个第一个是“127.0.0.1”是我们自己的本机IP地址并且后面这个就是请求的端口
3.总结 本期小编主要讲解了UDP的API的使用并且通过UDP提供的API实现回显服务器的实现当然这里设计到服务器和客户端两边的实现过程~~~
具体代码已上传gitee代码在这里network: 网络编程
~~~~最后希望与诸君共勉共同进步 以上就是本期内容了 感兴趣的话就关注小编吧。 期待你的关注~~~