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

JAVA学习第六十课 — UDP协议 &基于多线程模拟简单的QQ聊天程序

2014-11-01 16:17 946 查看
UDP传输

UDP有发送端和接受端,有两大类,DatagramSocket、DatagramPacket

建立发送端和接收端

建立数据包

调用Socket的接收发送方法

关闭Socket

注意:发送端和接收端是两个独立的运行程序

UDP发送端演示

[b]DatagramPacket(byte[] buf, int length,
InetAddress address, int port)


构造数据报包,用来将长度为
length
的包发送到指定主机上的指定端口号。[/b]

public static void UDPsendDemo() throws IOException {
System.out.println("发送端");
/*
* 创建UDP传输的发送端:
* 1.建立UDP的Socket服务
* 2.将要发送的数据封装到数据包中
* 3.用UDP的Socket服务将数据包发送出去
* 4.关闭Socket服务
*/
//建立UDP的Socket服务,使用DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//不指定端口号,发送端,就是随机的

//数据封装成包
String str = "udp发送";

//使用DatagramPacket将数据封装到该对象的包中
byte[] by = str.getBytes();
DatagramPacket dp = new DatagramPacket(by,by.length,InetAddress.getByName("127.0.0.1"),6534);

//通过UDP的Socket服务将数据包发送出去,send方法
ds.send(dp);
ds.close();
}

UDP接收端演示


public static void UDPreceiveDemo() throws IOException {
//接受端
System.out.println("接收端");
/*
* 创建UDP传输的接收端:
* 1.建立UDP的Socket服务,因为要接收数据,必须要明确端口号
* 2.创建数据包,用于存储接收到的数据,以便于用数据包的方法解析这些数据
* 3.使用Socket服务的receive方法接收的数据存储到数据包中
* 4.通过数据包中的方法解析包中数据
* 5.关闭
*/
//建立UDP的Socket服务,使用DatagramSocket对象
DatagramSocket ds = new DatagramSocket(6534);//接收端口6534

//创建数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);

//使用接收方法将数据存储到数据包
ds.receive(dp);//注意该方法是阻塞式的

//使用数据包对象的方法,解析其中的数据,如:地址、端口、内容
String ip = dp.getAddress().getHostAddress();//获取ip地址字符串

int port = dp.getPort();//获取端口

String datatext = new String(dp.getData(),0,dp.getLength());//将数据封装成字符串对象

System.out.println("ip:"+ip+"port : "+port+"data:"+datatext);

//关闭
ds.close();
}
基于多线程模拟简单的QQ聊天程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

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();

int port = dp.getPort();

String datatext = new String(dp.getData(),0,dp.getLength());
if(datatext.equals("over")){
System.out.println("ip:"+ip+"port : "+port+"退出聊天室");
}
else{
System.out.println("ip:"+ip+"port : "+port+"data:"+datatext);
}

}
} catch (Exception e) {
// TODO: handle exception
}
}
}

class Send implements Runnable{
private DatagramSocket ds;
public Send(DatagramSocket ds){
this.ds = ds;
}
public void run()
{
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine())!=null){

byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.255"),6534);
//IP的有效位是0-254,255是广播,也就是127.0.0,这一IP字段上所有存活的电脑都可以接收到我发的信息
ds.send(dp);
if("over".equals(line))break;
}
ds.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class Main {
public static void main(String[] args) throws IOException{

DatagramSocket dsend =new DatagramSocket();

DatagramSocket dr =new DatagramSocket(6534);
Send send = new Send(dsend);
Receive receive = new Receive(dr);
Thread t1 = new Thread(send);
Thread t2 = new Thread(receive);
t1.start(); t2.start();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: