/*
* 实现UDP的聊天程序
* 保证单一窗口的接收和发送
* 多线程技术实现,
* 主线程main,启动程序,开启两个线程,一个线程
* 运行接收端,一个线程运行发送端
* 运行的代码,封装到run方法中即可,DatagramSocket不能放在run
* DatagramSocket对象,在main创建完毕,传递给线程执行
*/
import java.net.*;
import java.io.*;
public class WangLuoBianCheng {
public static void main(String[] args) throws Exception{
Send se=new Send(new DatagramSocket());
Server sr=new Server(new DatagramSocket(8000));
Thread t1=new Thread(se);
Thread t2=new Thread(sr);
t1.start();
t2.start();
}
}
//定义类,实现Runnable接口,UDP的发送端
class Send implements Runnable{
private DatagramSocket ds;
Send(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
// IO流读取键盘输入
BufferedReader bu=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bu.readLine())!=null){
if(line.equals("886")){
break;
}
byte[] bytes=line.getBytes();
// 创建数据包对象,封装字节数组,长度,IP对象,端口号
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,InetAddress.getByName("192.168.33.22"),8000);
// 调用send方法
ds.send(dp);
}
// 关闭资源
ds.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
//定义类,实现Runnable接口,实现UDP接收端
class Server implements Runnable{
private DatagramSocket ds;
Server(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try{
// 字节数组
byte[] bytes=new byte[1024];
while(true){
// 创建数据包对象
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
// 调用接收端的receive方法
ds.receive(dp);
System.out.println(new String(bytes,0,dp.getLength()));
}
}catch(Exception e){
e.printStackTrace();
}
}
}
|
|