解析
此过程采用UDP发送数据,实际上是多线程的应用,每一个使用对象必须包含一个发送线程和一个接收线程,
代码实现
发送器
package internetProgram.udpProgram.onlineConsult;
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;
/**
* @author
* @date 2021/5/19-22:40
**/
public class Sender implements Runnable {
private DatagramSocket socket1;
private BufferedReader reader;
private int fromPort;
private String toIp;
private int toPort;
public Sender(int fromPort, String toIp, int toPort) {
this.fromPort = fromPort;
this.toIp = toIp;
this.toPort = toPort;
try {
socket1 = new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
String data = null;
try {
data = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
DatagramPacket dataPacket = new DatagramPacket(data.getBytes(StandardCharsets.UTF_8), 0, data.getBytes(StandardCharsets.UTF_8).length, new InetSocketAddress(this.toIp, this.toPort));
try {
socket1.send(dataPacket);
} catch (IOException e) {
e.printStackTrace();
}
if (data.equals("bye")) {
break;
}
}
socket1.close();
}
}
接收器
package internetProgram.udpProgram.onlineConsult;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* @author
* @date 2021/5/19-23:03
**/
public class Recevier implements Runnable {
private DatagramSocket socket1;
private String messFrom;
private int port;
public Recevier(int port, String messFrom) {
this.messFrom = messFrom;
this.port = port;
try {
socket1 = new DatagramSocket(this.port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
byte[] bytes = new byte[1024];
DatagramPacket dataPacket = new DatagramPacket(bytes, 0, bytes.length);
try {
socket1.receive(dataPacket);
} catch (IOException e) {
e.printStackTrace();
}
String message = new String(dataPacket.getData());
System.out.println(messFrom + " : " + message);
// message late maybe has space, so we should delete space, then compare
String messTrim = message.trim();
if (messTrim.equals("bye")) {
break;
}
}
socket1.close();
}
}
测试类
举例 :学生与老师的对话
学生
public class Student {
public static void main(String[] args) {
new Thread(new Sender(2222, "localhost", 3333)).start();
new Thread(new Recevier(4444, "teacher")).start();
}
}
老师
public class Teacher {
public static void main(String[] args) {
new Thread(new Sender(5555, "localhost", 4444)).start();
new Thread(new Recevier(3333, "student")).start();
}
}