使用UDP实现双向交流的代码
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;
/*
* 发送端
*/
public class TalkSend implements Runnable {
private DatagramSocket client;
private BufferedReader reader;
private String toIP;
private int toPort;
public TalkSend(int port,String toIP,int toPort) {
this.toIP=toIP;
this.toPort=toPort;
try {
client=new DatagramSocket(port);
reader=new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
String data;
try {
data = reader.readLine();
byte[] datas=data.getBytes();//字符串转成字节数组
//3.封装成DatagramPacket包裹,需要指定目的地
DatagramPacket packet
=new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));
//4.发送包裹send(DatagramPacket p)
client.send(packet);
if(data.equals("bye")) {
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//5.释放资源
client.close();
}
}
package cn.jd.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
* 接收端:使用面向对象封装(也就是加入属性加入方法加入构造器)
*/
public class TalkReceive implements Runnable {
private DatagramSocket server;
private String form;
public TalkReceive(int port,String from) {
this.form=from;
try {
server=new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
//2.准备容器 封装成DatagramPacket包裹
byte[] container=new byte[1024*60];//最多接收60K
DatagramPacket packet=new DatagramPacket(container, 0,container.length);
//3.阻塞式接收包裹receive(DatagramPacket p)
try {
server.receive(packet);//阻塞式
byte[] datas=packet.getData();//4.分析数据
int len=packet.getLength();
String data=new String(datas,0,len);
System.out.println(this.form+"说:"+data);
if(data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
//5.释放资源
server.close();
}
}
package cn.jd.udp;
/*
* 加入多线程实现双向交流,模拟在线咨询
*/
public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkSend(7777,"localhost",9999)).start();//发送
new Thread(new TalkReceive(8888,"老师")).start();//接收的端口是8888
}
}
package cn.jd.udp;
public class TalkTeacher {
public static void main(String[] args) {
new Thread(new TalkReceive(9999,"学生")).start();//接收的端口是9999
new Thread(new TalkSend(5555,"localhost",8888)).start();//发送
}
}