UDP实现聊天
QQ微信等聊天工具,原理是通过UDP实现的,在好友离线的时候也能向好友发送消息,就是因为UDP在发送消息前不需要建立连接。我们可以通过UDP通信来写一个简单的聊天工具。
首先我们创建一个发送线程,负责读取控制台的消息,并向接收端发送过去。在读取到"再见"的时候,停止发送,关闭程序。
public class Sender implements Runnable {
DatagramSocket socket;
String ip;
int port;
BufferedReader reader;
DatagramPacket packet;
//初始化IP地址,端口发,确定发送的对象
public Sender(String ip, int port) {
this.ip = ip;
this.port = port;
try {
//创建发送所需的socket
socket = new DatagramSocket();
//创建一个读取字符串的流
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//循环发送
while (true) {
//读取控制台需要发送的信息
String msg = reader.readLine();
//创建发送的包
packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, InetAddress.getByName(ip), port);
//发送
socket.send(packet);
//判断何时关闭
if ("再见".equals(msg)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
socket.close();
}
}
}
}
然后我们创建一个接收端,用于接收发送端发送的消息,并打印在控制台上。如果接收到"再见",则停止接收,关闭程序。
public class Receive implements Runnable {
DatagramSocket socket;
int port;
DatagramPacket packet;
public Receive(int port) {
try {
//初始化端口号
this.port = port;
//创建接收所需的socket
socket = new DatagramSocket(port);
//一次读取1024个字节
packet = new DatagramPacket(new byte[1024], 0, 1024);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//循环接收
while (true) {
//接收发送端发送的消息
socket.receive(packet);
//将消息转化为字符串
String msg = new String(packet.getData(), 0, packet.getLength());
//打印在控制台
System.out.println(msg);
//判断何时结束循环
if ("再见".equals(msg)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
if (socket == null) {
socket.close();
}
}
}
}
最后我们创建一个学生和老师,同时启动,就可以在控制台上实现聊天了。
public class Student {
public static void main(String[] args) {
//学生对象
//向老师发送消息,老师ip为127.0.0.1,端口为9999
new Thread(new Sender("127.0.0.1",9999)).start();
//接收老师发送的消息,接收端口号为8888
new Thread(new Receive(8888)).start();
}
}
public class Teacher {
public static void main(String[] args) {
//老师对象
//接收学生发送的消息,接收端口号为9999
new Thread(new Receive(9999)).start();
//向学生发送消息,学生ip为127.0.0.1,端口为8888
new Thread(new Sender("127.0.0.1",8888)).start();
}
}