简绍
- 发送和接受分别对应一个线程,每一线程都要可以发信息和接受信息
主类
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Scanner;
public class MainTest {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入聊天服务当前启动的端口:");
int serverPort = input.nextInt();
System.out.print("请输入聊天服务发送信息对象的端口:");
int targetPort = input.nextInt();
System.out.println("聊天系统初始化完毕!");
try {
//创建聊天对象的收发平台对象
DatagramSocket socket = new DatagramSocket(serverPort);
//分别启动俩个线程对象
new Thread(new checkSend(socket, targetPort), "发送服务").start();
new Thread(new checkRecever(socket), "接收服务").start();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
发送
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
//实现Runnable接口
public class checkSend implements Runnable {
private DatagramSocket socket;
private int targetPort;
public checkSend(DatagramSocket socket, int targetPort) {
this.socket = socket;
this.targetPort = targetPort;
}
@Override
public void run() {
try {
//输入要传送的信息
Scanner input = new Scanner(System.in);
while (true) {
String data = input.nextLine();
//转换输入信息的数据类型
byte[] bytes = data.getBytes();
//对数据进行包装
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), targetPort);
//发送信息
socket.send(packet);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class checkRecever implements Runnable {
private DatagramSocket socket;
public checkRecever(DatagramSocket socket){
this.socket = socket;
}
@Override
public void run() {
try{
byte [] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
while (true){
//接收传过来的信息
socket.receive(packet);
String str = new String(packet.getData(),0,packet.getLength());
System.out.println("收到"+packet.getAddress()+":"+packet.getPort()+"发送数据:"+str);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
效果