建设银行扬中网站,微信营销的方法7种,广告设计制作工作室,wordpress简约电影回显服务器表示客户端发的是啥#xff0c;服务器就返回啥#xff0c;主要是为了熟悉UDP数据报网络编程的基本步骤 对于程序的所有分析都写到了代码上
UDP回显服务器代码
package UdpEcho;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.Dat… 回显服务器表示客户端发的是啥服务器就返回啥主要是为了熟悉UDP数据报网络编程的基本步骤 对于程序的所有分析都写到了代码上
UDP回显服务器代码
package UdpEcho;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2023-08-09* Time: 11:52*/
//UDP回显服务器客户端发的是啥服务器就返回啥
//通过UDP回显服务器的实现来简单熟悉创建服务器的API
//我们创建了DatagramSocket类的对象但是在程序中没有调用close方法关闭该对象
//1.我们整个程序只实例化了一个DatagramSocket类的对象socket
//2.socket对象的生命周期非常长是跟随整个程序的此时就需要socket对象保持打开的状态
//3.socket对象-系统中的socket文件-文件描述符进程的pcb进程控制块的属性最主要的目标是为了释放文件描述符表中的文件描述符才要关闭socket对象
//而进程结束就把pcb回收里面的文件描述符表自然也被销毁了
//当程序中有多个socket对象socket对象的生命周期较短需要频繁的创建和释放一定要记得close
public class UdpEchoServer {//对于实现UDP服务器DatagramSocket是不可或缺的类//要通过DatagramSocket类的对象网卡对象来进行客户端与服务器之间的数据交换private DatagramSocket socketnull;//在实例化UDP回显服务器的时候就要实例化一个DatagramSocket对象网卡对象//对于服务器我们在实例化DatagramSocket对象时需要指明服务器的端口号方便客户端寻找public UdpEchoServer(int port) throws SocketException {socketnew DatagramSocket(port);}//定义一个start方法来启动UDP回显服务器public void start() throws IOException {System.out.println(服务器启动);//服务器启动以后要一直去接收客户端传来的请求并进行处理以及回应while (true){//服务器在启动以后要处理的三件核心环节//1.读取客户端传来的请求并解析客户端传来的请求是一个二进制数组要根据实际情况解析为字符串或数字等等//UDP服务器进行发送和接收的数据单位是UDP数据报DatagramPacket//DatagramPacket数据报类型有两个参数当DatagramPacket类型的对象用于接收数据就不需要提供ip地址和端口号SocketAddressDatagramPacket requestPacketnew DatagramPacket(new byte[4080],4080);//客户端传来的请求数据报就会存储到DatagramPacket类型的对象requestPacket中//receive方法自带阻塞等待当服务器没有接受到客户端传来的请求时在receive方法这里就会进入阻塞等待直到客户端传来请求为止socket.receive(requestPacket);//2.根据请求计算出响应这个是在实际工作中我们最主要编写的逻辑//由于回显服务器对数据的处理很简单客户端发的是啥服务器就返回啥//所以我们将客户端发出的请求转换为字符串再把字符串传递给客户端即可String requestnew String(requestPacket.getData(),0,requestPacket.getLength());String reposehandle(request);//3.把响应发送给客户端//发送的响应也是DatagramPacketUDP数据报类型//由于要将响应发送给客户端所以需要知道客户端的ip地址和端口号SocketAddress类型//requestPacket接收客户端传来的请求中含有服务器和客户端的ip地址和端口号//可以通过getSocketAddress方法获得客户端的ip地址和端口号SocketAddress类DatagramPacket reponsePacketnew DatagramPacket(repose.getBytes(),repose.getBytes().length,requestPacket.getSocketAddress());socket.send(reponsePacket);//服务器就完成了接收数据处理数据发送数据的过程//记录日志方便观察程序执行效果//requestPacket是客户端传给服务器的请求报所以其中有客户端和服务器的ip地址和端口号//通过getAddress方法获得客户端的ip地址getPort方法获得客户端的端口号System.out.printf([%s,%d] request:%s repose:%s\n,requestPacket.getAddress().toString(),requestPacket.getPort(),request,repose);}}//对客户端传来的请求进行处理private String handle(String request){return request;}public static void main(String[] args) throws IOException {UdpEchoServer udpEchoServernew UdpEchoServer(8080);udpEchoServer.start();}
}UDP回显客户端的代码
package UdpEcho;import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2023-08-09* Time: 11:53*/
//UPD回显客户端
public class UdpEchoClient {private DatagramSocket socketnull;private String ipServernull; //用来存储用户提供的服务器ip地址private int portSever0; //用来存储用户提供的服务器端口号//在实例化客户端的时候需要用户提供服务器的ip地址和端口号这样才知道该客户端要联系哪个服务器public UdpEchoClient(String ipServer,int portSever) throws SocketException {this.ipServeripServer;this.portSeverportSever;//因为客户端的端口号是有操作系统随机分配的要是指定客户端的端口号可能会导致冲突//所以实例化DatagramSocket对象的时候不写参数不指定端口号socketnew DatagramSocket();}//开启客户端public void start() throws IOException {Scanner scannernew Scanner(System.in);System.out.println(客户端启动);//要不停的读取用户输入的请求将请求发送给服务器并接收服务器发送回来的响应while (true){System.out.print(请求-);String requestscanner.next();//根据用户输入的请求实例化DatagramPacket数据报因为UDP类型网络编程数据传输的基本单位是DatagramPacket数据报//由于要将客户端的请求发送给服务器所以需要在DatagramPacket类中声明服务器的ip地址和端口号//通过InetAddress类调用静态方法getByName实例化InetAddress类型的对象getByName方法可以叫做工厂方法DatagramPacket requestPacketnew DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(ipServer),portSever);//将用户的请求发送给客户端socket.send(requestPacket);//接收服务器返回的的回应DatagramPacket reposePacketnew DatagramPacket(new byte[4080],4080);socket.receive(reposePacket);//对回应的数据报进行解析String reposenew String(reposePacket.getData(),0,reposePacket.getLength());//输出解析后得到的回应System.out.println(repose);}}public static void main(String[] args) throws IOException {UdpEchoClient udpEchoClientnew UdpEchoClient(127.0.0.1,8080);udpEchoClient.start();}
}当我们用idea实现了上面的代码后可以通过idea如何开启多个客户端一个代码开启多个客户端运行来检验多个客户端向服务器传送请求的运行情况