UDP中最简单的网络编程(但是我头大)

服务器

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
    //对于一个服务器程序来说,核心流程也是要分成两步

    //1.进行初始化操作(实列化socket对象)
    //2.进入主循环,接受并处理请求
    // a 读取数据并解析
    // b 根据请求计算响应
    // c 把响应结果写回到客户端
    private DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
       this.socket = new DatagramSocket(port);
    }

    //服务器的启动代码
    public void start() throws IOException {
        System.out.println("服务器启动");

        while (true) {
            //a 读取请求并解析
            //字节流
                 //构建一个requestPacket
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);
                //得到的数据为放入requestPacket
            socket.receive(requestPacket);
                 //这一步可以理解为解封装
            String request = new String(requestPacket.getData(),
                    0, requestPacket.getLength());
            //b 根据请求计算响应
                 //构建一个函数,专门来写服务器的回应
            String response = process(request);
            //c 把响应写回到客户端,响应数据就是response
                //把响应封装成Packet
            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;
    }

}

客户端

package UDP;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UdpEchoClient {
    // 客户端的主要流程分成四步.
    // 1. 从用户这里读取输入的数据.
    // 2. 构造请求发送给服务器
    // 3. 从服务器读取响应
    // 4. 把响应写回给客户端.

    private DatagramSocket socket = null;
    private String serverIp;
    private int serverPort;

    // 需要在启动客户端的时候来指定需要连接哪个服务器
    // 我们需要输入ip地址,和端口号。
    //  然后 这个socket 会自动和服务器的连接,
    //  就是这个socket 就会被实列化
    public UdpEchoClient(String serverIp, int serverPort) throws SocketException {
        this.serverIp = serverIp;
        this.serverPort = serverPort;
        socket = new DatagramSocket();
    }

    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            // 1. 读取用户输入的数据
            System.out.print("-> ");
            String request = scanner.nextLine();
            if (request.equals("exit")) {
                break;
            }

            // 2. 构造请求发送给服务器
                  //我们这个request 必须封装成DatagramPacket,然后才可以发送过去
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),
                    request.getBytes().length, InetAddress.getByName(serverIp),
                    serverPort);//这个与端口号建立连接
                 //发送过去
            socket.send(requestPacket);
            // 3. 从服务器读取响应
                 //服务器读过来的也是DatagramPacket。
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
                //接受信号。
            socket.receive(responsePacket);
                // 然后解封。
            String response = new String(responsePacket.getData(), 0, responsePacket.getLength()).trim();
            // 4. 显示响应数据
            System.out.println(response);
        }
    }


    public static void main(String[] args) throws IOException {
        UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);
        client.start();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值