既然要实现交流,那么就要发送消息和接收消息
所以要用到多线程
我们写两个类,分别时发消息的类:
package ip.udp.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
/**
* @ClassName fa
* @Author 瞿肖
* @Date 2022/7/13 11:11
*/
public class fa implements Runnable {
private String name;
private String ip;
private int port;
private DatagramPacket packet = null;
public fa(String name, String ip, int port) {
this.name = name;
this.ip = ip;
this.port = port;
}
@Override
public void run() {
BufferedReader reader = null;
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
reader = null;
while (true) {
//从键盘获取
reader = new BufferedReader(new InputStreamReader(System.in));
String data = name + ":" + (reader.readLine());
//打包
byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(ip, port));
//发送
socket.send(packet);
if (data.equals(name + ":" + "bye")) {
break;
}
}
} catch (SocketException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (socket != null) {
System.out.println("发送关闭");
socket.close();
}
}
}
}
}
循环获取控制台的输入,打包发送给接收方
这边利用构造方法传入名字,ip,端口(用于发送)
接收类:
package ip.udp.util;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* @ClassName shou
* @Author 瞿肖
* @Date 2022/7/13 11:12
*/
public class shou implements Runnable {
private String ip;
private int port;
public shou(String ip, int port) {
this.ip = ip;
this.port = port;
}
@Override
public void run() {
DatagramSocket socket = null;
try {
//创建端口
socket = new DatagramSocket(port);
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
//获取数据
while (true) {
socket.receive(packet);
byte[] data = packet.getData();
String s = new String(data, 0, packet.getLength());
System.out.println(s);
if (s.substring(s.length() - 3, s.length()).equals("bye")) {
break;
}
}
} catch (SocketException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (socket != null) {
System.out.println("接收关闭");
socket.close();
}
}
}
}
这个也是循环接收包,然后输出
利用构造方法传入ip和端口(用于创建接收)
A:
package ip.udp.liaoTian;
import ip.udp.util.fa;
import ip.udp.util.shou;
import thread.Thread3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
import java.nio.charset.StandardCharsets;
/**
* @ClassName A
* @Author 瞿肖
* @Date 2022/7/13 10:19
*/
public class A {
public static void main(String[] args) {
new Thread(new shou("127.0.0.1", 6666)).start();
new Thread(new fa("老师", "127.0.0.1", 9090)).start();
}
}
B:
package ip.udp.liaoTian;
import ip.udp.util.fa;
import ip.udp.util.shou;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @ClassName B
* @Author 瞿肖
* @Date 2022/7/13 10:19
*/
public class B {
public static void main(String[] args) {
new Thread(new shou("127.0.0.1", 9090)).start();
new Thread(new fa("学生", "127.0.0.1", 6666)).start();
}
}
两个开启的接收端口就是互相的发送端口,