您的位置:首页 > 编程语言 > Java开发

【java基础:net】基于多线程的UDP发送和接收的聊天Demonstration

2017-11-22 00:27 447 查看
第一部分:发送端

package net.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 需求:创建一个发送端的线程,该线程的数据来源于键盘。
*/
public class Send implements Runnable {
DatagramSocket ds=null;

public Send(DatagramSocket ds) {
super();
this.ds = ds;
}

@Override
public void run() {
try {
//从键盘中获取数据
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=null;
while((str=br.readLine())!=null) {
//创建一个数据包,IP地址可自行设置,以255结尾的地址将会发送至1-254所有点的接收端(即发送给以192.168.1.1开始的所有点)。
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.1.255"),20000);
ds.send(dp);
if(str.equals("886")) {
break;
}
}
ds.close();
} catch(Exception e){
//
}
}
}


第二部分:接收端

package net.chat;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
* 需求:接收UDP数据包并显示。
*/
public class Receive implements Runnable {
DatagramSocket ds=null;

public Receive(DatagramSocket ds) {
super();
this.ds = ds;
}

@Override
public void run() {
try {
//不断地接收数据包
while(true) {
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);//阻塞式!!
//接下来是解析数据包中的信息,需要知道:ip地址,发送端的端口号,发送的内容。
String ip=dp.getAddress().getHostName();
String text=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println("ip地址:"+ip+"\n"+"发送端端口号:"+port+"\n"+"内容:"+text);
if(text.equals("886")){
System.out.println(ip+":"+port+"....退出聊天室");
}
}

} catch (Exception e) {
// TODO: handle exception
}
}
}
第三部分:主程序

package net.chat;

import java.net.DatagramSocket;
import java.net.SocketException;
/*
* 创建两个分别用于发送和接收的Socket,并且为发送和接收启动两个不同的线程。
*/
public class Chat {

public static void main(String[] args) throws SocketException {
DatagramSocket send=new DatagramSocket(2017);
DatagramSocket rece=new DatagramSocket(20000);
new Thread(new Send(send)).start();
new Thread(new Receive(rece)).start();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐