发送者进程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class TalkSender implements Runnable{
private DatagramSocket sender;
private BufferedReader reader;
private DatagramPacket packet;
private int localPort;//本进程端口
private String targetIP;//目标主机IP
private int targetPort;//目标主机端口
public TalkSender(int localPort,String targetIP,int targetPort){
this.localPort = localPort;
this.targetIP = targetIP;
this.targetPort = targetPort;
try {
sender = new DatagramSocket(localPort);//创建发送端
reader = new BufferedReader(new InputStreamReader(System.in));//创建文本输入器
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void run() {
String msg;
try {
while (true) {
msg = reader.readLine();
byte[] datas = msg.getBytes();
packet = new DatagramPacket(datas,0,datas.length,
new InetSocketAddress(this.targetIP,this.targetPort));
sender.send(packet);
if (msg.equals("exit")){
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
sender.close();
try {
if(reader!=null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收者进程
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class TalkReceiver implements Runnable {
private DatagramSocket receiver;
private DatagramPacket packet;
private String targetName;
private int localPort;//本进程端口
public TalkReceiver(int localPort,String targetName){
this.localPort = localPort;
this.targetName = targetName;
}
@Override
public void run() {
try {
receiver = new DatagramSocket(localPort);//创建接收端
while (true) {
byte[] buf = new byte[1024*60];
DatagramPacket p = new DatagramPacket(buf,0,buf.length);
receiver.receive(p);//阻塞
String msg = new String(p.getData(),0,p.getLength());
System.out.println(targetName+":"+msg);
if (msg.equals("exit")){
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
receiver.close();
}
}
主程序
public class Client {
public static void main(String[] args) {
new Thread(new TalkSender(4396,"localhost",2800)).start();
new Thread(new TalkReceiver(7777,"对方")).start();
}
}
public class Server {
public static void main(String[] args) {
new Thread(new TalkReceiver(2800,"对方")).start();
new Thread(new TalkSender(6666,"localhost",7777)).start();
}
}
为了实现客服端和服务端双向交流,需要利用多线程实现