发送类
package network.udp.talk;
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;
/**
* @ClassName TalkSend
* @Description
* @Author SkySong
* @Date 2020-09-25 20:00
*/
public class TalkSend implements Runnable{
//数据报套接字 是遵循UDP协议的套接字类
DatagramSocket socket = null;
//读取缓存类 用来缓存所读取的数据的类
BufferedReader reader = null;
//目标IP
private String toIP;
//目标端口
private int toPort;
//本应用端口
private int fromPort;
public TalkSend(String toIP, int toPort, int fromPort) {
this.toIP = toIP;
this.toPort = toPort;
this.fromPort = fromPort;
try {
//初始化
socket = new DatagramSocket(fromPort);
//让其缓存从控制台读取的数据
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
System.out.println("请输入...");
while (true){//循环发送
String r = null;
try {
r = reader.readLine();
byte[] data = r.getBytes();
// byte[] 0 byte[].length InetSocketAddress("IP",port)
DatagramPacket sendPacket = new DatagramPacket(
data,
0,
data.length,
new InetSocketAddress(toIP,toPort));
//发出
socket.send(sendPacket);
if (r.equals("bye")){
System.out.println("聊天结束。");
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
接收类
package network.udp.talk;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* @ClassName TalkReceive
* @Description
* @Author SkySong
* @Date 2020-09-25 20:16
*/
public class TalkReceive implements Runnable{
DatagramSocket socket = null;
//本应用端口
private int port;
//从哪来的数据 标识
private String fromMsg;
public TalkReceive(int port, String fromMsg) {
this.port = port;
this.fromMsg = fromMsg;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
try {
//创建接收包裹
byte[] buffer = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(buffer,0,buffer.length);
//接收(阻塞式)
socket.receive(receivePacket);
//拆包
String msg = new String(receivePacket.getData(),0,receivePacket.getData().length);
System.out.println(fromMsg +" :" +msg);
if ("bye".equals(msg.trim())){
System.out.println("对方已离开。");
break;
}
} catch (Exception e){
e.printStackTrace();
}
}
socket.close();
}
}
多线程开启类
package network.udp.talk;
/**
* @ClassName Talking
* @Description
* @Author SkySong
* @Date 2020-09-25 20:22
*/
public class Talking_1 {
public static void main(String[] args) {
//开启两个线程
new Thread(new TalkSend("localhost",9999,5555)).start();
new Thread(new TalkReceive(8888,"本我")).start();
}
}
package network.udp.talk;
/**
* @ClassName Talking_2
* @Description
* @Author SkySong
* @Date 2020-09-25 20:30
*/
public class Talking_2 {
public static void main(String[] args) {
//开启两个线程
new Thread(new TalkSend("localhost",8888,6555)).start();
new Thread(new TalkReceive(9999,"超我")).start();
}
}
cmd窗口运行
idea居然不支持控制台分窗口!!
纯属个人总结,有不妥的地方 大家评论区见。