作者:困了电视剧
专栏:《JavaEE初阶》
文章分布:这是一篇关于网络编程的文章,在这篇文章中我会剖析一段回显服务程序的执行步骤和代码编程,希望对你有所帮助!
目录
客户端
服务端
总结
客户端
现在我们是客户端,我们需要知道的是与我们对应的服务端的ip地址和端口号以知道服务器在哪,同时我们还需要一个对象socket——网卡的抽象表示,以操控网卡进行通信。
定义好成员变量之后,我们需要写一个构造方法:
这里不要求客户端的ip地址和端口号,是因为我们需要解决问题的服务端是固定的,所以我们需要知道服务端的ip以方便找到,而客户端可以是任意一个有相关需求的机子。
并且在进行一次网络通信的过程中,是客户端先给服务端发送请求,然后服务端再给客户端发送响应。在这期间客户端需要地址以找到服务端,而服务端可以根据发来的数据报中包含的地址信息找到客户端。
这个start方法就是客户端与服务端进行交互进行的步骤可分为:先输入请求,然后调用方法将请求和ip地址端口号等打包成一个UDP数据报,然后socket将这个数据报进行发送,发送完之后创建一个空的数据报(本例中是responsePacket)用来接受发来的响应,我们可以调用相关方法将响应放到字符串中并打印出来。
具体代码如下:
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class UdpEchoClient {
private DatagramSocket socket = null;
private String serverIP;
private int serverPort;
//客户端启动,需要知道服务器在哪里
public UdpEchoClient(String serverIP,int serverPort) throws SocketException {
//对于客户端来说,不需要显示关联端口
//不代表没有端口,而是系统自动分配了个空闲的端口
socket = new DatagramSocket();
this.serverIP = serverIP;
this.serverPort = serverPort;
}
public void start() throws IOException {
// 通过这个客户端可以多次和服务器进行交互
Scanner scanner = new Scanner(System.in);
while (true){
System.out.print("->");
//request就是请求
String request = scanner.nextLine();
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
InetAddress.getByName(serverIP),serverPort);
socket.send(requestPacket);
//空的数据报以接受响应
DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
socket.receive(responsePacket);
String response = new String(responsePacket.getData(),0,responsePacket.getLength());
System.out.printf("req: %s, resp: %s\n", request, response);
}
}
public static void main(String[] args) throws IOException {
UdpEchoClient udpEchoClient = new UdpEchoClient("127.0.0.1",9090);
udpEchoClient.start();
}
}
服务端
由于服务端并不需要知道客户端的ip地址和端口号,所以只需要构造一个socket对象即可。
因为这是服务端,所以需要等待客户端发送的请求才能执行相应的逻辑,所以在接收之前要先构造一个空的数据报用来接收请求
为了方便我们处理这个请求,我们可以调用相关的方法将这个数据包装成字符串,然后我们通过我们自己写的process方法来处理这个请求,这里用process方法封装处理过程可以大大提高代码的可读性,执行完后将响应包装成数据报进行发送,我们可以通过getSocketAddress方法来获取发来的客户端的ip地址和端口号,封装完成后,再调用send方法发送响应即可。
由于我们写的是回显服务器,所以处理的业务就是将客户端发来的信息在发送给客户端。
最后在main方法中开启服务端。
完整代码如下:
public class UdpEchoServer {
//首先先定义一个socket对象
//通过网络通信,必须要是用socket对象,通过这个对象来操作网卡
private DatagramSocket socket = null;
//绑定一个端口
public UdpEchoServer(int port) throws SocketException {
socket = new DatagramSocket(port);
}
//启动服务器的主逻辑
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());
String response = process(request);
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
requestPacket.getSocketAddress());
socket.send(responsePacket);
System.out.printf("[%s:%d] req: %s, resp: %s\n", requestPacket.getAddress().toString(),
requestPacket.getPort(), request, response);
}
}
public String process(String request) {
return request;
}
public static void main(String[] args) throws IOException {
UdpEchoServer udpEchoServer = new UdpEchoServer(9090);
udpEchoServer.start();
}
}
总结
我们在运行一套客户端和服务端的时候,一定是要先开启服务端在开启客户端,这样才能运行。
大体流程就是:客户端先向服务端发送一个请求,然后服务端接受请求处理业务,处理业务完成后将响应再发送给客户端,客户端拿到发来的响应后进行下一步的工作。
以上就是本篇博客的全部内容,如有疏漏欢迎指正!