基于UDP实现一个“伪智能”聊天机器人

基于UDP实现一个“伪智能”聊天机器人

首先,我们先来了解一些基本知识:

  • 使用DatagramSocket发送、接收数据。
    Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。

  • DatagramSocket(int prot):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口。

  • 一旦得到了DatagramSocket实例之后,就可以通过如下两个方法来接收和发送数据。
    receive(DatagramPacket p):从该DatagramSocket中接收数据报。
    send(DatagramPacket p):以该DatagramSocket对象向外发送数据报。

  • 使用DatagramSocket发送数据报时,DatagramSocket并不知道将该数据报发送到哪里,而是由DatagramPacket自身决定数据报的目的地。就像码头并不知道每个集装箱的目的地,码头只是将这些集装箱发送出去,而集装箱本身包含了该集装箱的目的地。

  • DatagramPacket(byte[] buf,int length):以一个空数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据。

  • DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket对象时还指定了IP地址和端口–这就决定了该数据报的目的地。

有了以上的知识储备,接下来我们就可以具体实现啦!

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

/**
 * UDP服务器端
 */
public class UDPServe {
    
    
    private static final int port = 9001;
    private static final int bleng = 1024;
    public static void main(String[] args) throws IOException {
    
    
        //创建一个UDP服务器
        DatagramSocket socket = new DatagramSocket(port);

        while(true) {
    
    
            //创建接受客户端数据的数据包
            DatagramPacket clientPacket = new DatagramPacket(
                    new byte[bleng],bleng
            );
            //等待客户端连接
            socket.receive(clientPacket);
            //执行此代码表示已经有客户端连接了

            //拿到客户端的请求信息了。clientPacket.getData()获得的是byte数组
            //将字节数组转换成Sting,利用new String即可;
            String msg = new String(clientPacket.getData());
            System.out.println("接受到客户端的消息:" + msg);
            //给客户端发送消息
            String serMsg = msg.replace("吗?","").replace("你","我");
            //构建客户端发送数据包
            DatagramPacket serPacket = new DatagramPacket(
                    serMsg.getBytes(),
                    serMsg.getBytes().length,//字节数组的长度
                    clientPacket.getAddress(),
                    clientPacket.getPort()

            );
            socket.send(serPacket);
        }
    }

}
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**
 * UDP客户端
 */
public class UDPClient {
    
    
    private static final int port = 9001;
    private static final String ip = "127.0.0.1";
    private static final int bleng = 1024;
    public static void main(String[] args) throws IOException {
    
    
        //创建客户端,客户端不需要固定端口号的,默认的new会生成一个动态的端口号
        DatagramSocket socket = new DatagramSocket();
        Scanner scanner = new Scanner(System.in);
        while(true) {
    
    
            System.out.println("->");
            String msg = scanner.nextLine();
            DatagramPacket datagramPacket = new DatagramPacket(
                    msg.getBytes(),
                    msg.getBytes().length,
                    InetAddress.getByName(ip),//注意:不能直接放地址,需要利用
                    // InetAddress.getByName()函数;
                    port
            );
            socket.send(datagramPacket);
            //接受服务器的消息
            DatagramPacket serPacket = new DatagramPacket(new byte[bleng],bleng);
            socket.receive(serPacket);
            String serMsg = new String(serPacket.getData());
            System.out.println(serMsg);
        }
    }
}

结果:
在这里插入图片描述
注意:在运行时应先运行服务器端,之后再运行客户端。

猜你喜欢

转载自blog.csdn.net/change_xzt/article/details/115771860