------- android培训、java培训、期待与您交流! ----------
/**
* 编写一个聊天程序
* 有收数据的部分,和发数据的部分
* 两个部分需要同时执行
* 那就需要用到多线程技术
* 一个线程控制收,一个线程控制发
*
* 因为收和发是不一致的,所以要定义两个run方法
* 而且这两个方法要封装到两个不同的类中
*
*/
//发送端
class Send implements Runnable{
//用来发送和接收数据报包的套接字
private DatagramSocket ds;
public Send(DatagramSocket ds){
this.ds=ds;
}
public void run(){
//获取键盘录入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
//判断读取的内容
while((line=bufr.readLine())!=null){
if("886".equals(line)){
break;
}
//把数据封装到数据报包当中,用来将长度为 length
的包发送到指定主机上的指定端口号
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),10002);
//利用DatagramSocket对象发送数据
ds.send(dp);
}
} catch (UnknownHostException e) {
System.out.println("主机异常");
} catch (IOException e) {
System.out.println("IO异常");
}
}
}
//接收端
class Receive implements Runnable{
//用来发送和接收数据报包的套接字
private DatagramSocket ds;
public Receive(DatagramSocket ds){
this.ds=ds;
}
public void run(){
try {
//接收端一直保持接收状态
while(true){
byte[] buf = new byte[1024];
//接收端的数据报包不用指定主机和端口
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//接收数据报包
ds.receive(dp);
//获取数据报包中的信息
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
}
} catch (IOException e) {
System.out.println("接收端失败");
}
}
}
public class ChatDemo {
public static void main(String[] args) throws Exception {
//建立发送端socket对象
DatagramSocket sendSocket = new DatagramSocket();
//建立接收端socket对象,接收端监听的接口必须和发送端数据包指定的端口一致
DatagramSocket receiveSocket = new DatagramSocket(10002);
//发送端线程,通过Send的构造函数,初始化发送端socket对象
new Thread(new Send(sendSocket)).start();
//接收端线程
new Thread(new Receive(receiveSocket)).start();
}
}