UDP
单方发送
发送方A
public class UdpA {
public static void main(String[] args) throws Exception {
//数据报通信
DatagramSocket socket = new DatagramSocket();
//建立包裹
String msg = "UDP发送我...";
InetAddress localhost = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, 9090);
//发送包裹
socket.send(packet);
socket.close();
}
}
接收方B
public class UdpB {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//建立接收数据包
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
//接收包裹
socket.receive(packet);
System.out.println(packet.getAddress());
System.out.println(new String(packet.getData()));
socket.close();
}
}
连续发送
发送方A
public class UdpA {
public static void main(String[] args) throws Exception {
//数据报通信 端口8888
DatagramSocket socket = new DatagramSocket(8888);
//建立数据包
//从键盘获取
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true){
String readLine = br.readLine();
byte[] bytes = readLine.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getByName("localhost"), 9999);
byte[] data = packet.getData();
if (data.equals("bye")){
break;
}
//发送
socket.send(packet);
}
socket.close();
}
}
接收方B
public class UdpB {
public static void main(String[] args) throws Exception {
//建立数据报 端口9999
DatagramSocket socket = new DatagramSocket(9999);
while (true){
//建立接收的包裹
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
//当接收到bye断开连接
byte[] data = packet.getData();
if (data.equals("bye")){
break;
}
//接收包裹
socket.receive(packet);
System.out.println(new String(packet.getData()));
}
socket.close();
}
}
双方聊天
发送方
public class ChatSend implements Runnable{
private int myPort;
private int yourPort;
private String yourIp;
DatagramSocket socket = null;
DatagramPacket packet = null;
BufferedReader bs = null;
public ChatSend(int myPort, int yourPort, String yourIp) {
this.myPort = myPort;
this.yourPort = yourPort;
this.yourIp = yourIp;
try {
socket = new DatagramSocket(myPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
//读取控制台输入的
bs = new BufferedReader(new InputStreamReader(System.in));
String line = bs.readLine();
byte[] bytes = line.getBytes();
packet = new DatagramPacket(bytes, 0, bytes.length, InetAddress.getByName(yourIp), yourPort);
//发送
socket.send(packet);
//断开连接
if (packet.getData().equals("bye")){
break;
}
}catch (Exception e){
e.printStackTrace();
}
}
socket.close();
}
}
接收方
public class ChatReceive implements Runnable{
private int myPort;
private String name;
DatagramSocket socket = null;
DatagramPacket packet = null;
public ChatReceive(int myPort, String name) {
this.myPort = myPort;
this.name = name;
try {
socket = new DatagramSocket(myPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
byte[] buf = new byte[1024];
packet = new DatagramPacket(buf, 0, buf.length);
socket.receive(packet);
//接收到bye断开连接
byte[] data = packet.getData();
//断开连接
if (data.equals("bye")){
break;
}
System.out.println(name + ":" + new String(data, 0, data.length));
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
测试
public class Teacher {
public static void main(String[] args) {
new Thread(new ChatSend(0000, 1111, "localhost")).start();
new Thread(new ChatReceive(2222, "学生")).start();
}
}
public class Student {
public static void main(String[] args) {
new Thread(new ChatReceive(1111, "老师")).start();
new Thread(new ChatSend(3333, 2222, "localhost")).start();
}
}
如有不对的地方欢迎指出,共同进步!