基于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);
}
}
}
结果:
注意:在运行时应先运行服务器端,之后再运行客户端。