udp 简单使用

[b]udp 概述[/b]

user datagram protocol , 用户数据报协议,
无连接的协议,发送端无法得知发送结果,

特点:
高效,
稳定性 & 可靠性 差,

udp 相关类:SocketAddress,DatagramPacket,DatagramSocket

------
1 [b]SocketAddress[/b]

表示 socket 端口,即 ip:port,
SocketAddress 是 虚类,其实现类为 InetSocketAddress,

如:
InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 29191);

------
2 [b]DatagramPacket[/b]

用于表示 数据包,

属性:
* data
byte[] , 用于存储数据,包括 接受 和 发送的数据,
* address & port
表示了其 socket 地址,
* ...
*

如:
InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 29191);
byte[] bsSd = { 12, 43, 67 };
DatagramPacket dpSd = new DatagramPacket(bsSd, bsSd.length);
dataPacket.setSocketAddress(isa);

------
3 [b]DatagramSocket[/b]

用于 发送 & 接收 数据,

DatagramSocket 中数据的存储
DatagramSocket 使用 DatagramPacket 存储数据,包括 发送 和 接收,

方法:
* send()
发送
* receive()
接收
*

如:
InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 29191);
// sender
byte[] bsSd = { 12, 43, 67 };
DatagramPacket dpSd = new DatagramPacket(bsSd, bsSd.length);
DatagramSocket dsSd = new DatagramSocket();
dpSd.setSocketAddress(isa);
dsSd.send(dpSd);
System.out.println("send:" + dpSd.getData()[0] + " ... ," + new Date());

------
[b]例子[/b]:

* [b]发送数据[/b]

package eric.udp.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.Date;
import java.util.Random;

public class UdpSender implements Runnable {
private SocketAddress target;
private DatagramPacket dataPacket;
private DatagramSocket dataSender;

public UdpSender() {}

public UdpSender(SocketAddress target, DatagramPacket dataPacket, DatagramSocket dataSender) {
this.target = target;
this.dataPacket = dataPacket;
this.dataSender = dataSender;
}

@Override
public void run() {
Random rd = new Random();
try {
while (true) {
Thread.sleep(1000);
dataPacket.getData()[0] = (byte) rd.nextInt(127);
dataPacket.setSocketAddress(target);
dataSender.send(dataPacket);
System.out.println("send:" + dataPacket.getData()[0] + " ... ," + new Date());
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
try {
byte[] bs = { 12, 43, 67 };
InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 29191);
DatagramPacket dp = new DatagramPacket(bs, bs.length);
DatagramSocket ds = new DatagramSocket();
UdpSender sender = new UdpSender(isa, dp, ds);
Thread t = new Thread(sender);
t.start();
} catch (SocketException e) {
e.printStackTrace();
}
}

public SocketAddress getTarget() {
return target;
}

public void setTarget(SocketAddress target) {
this.target = target;
}

public DatagramPacket getDataPacket() {
return dataPacket;
}

public void setDataPacket(DatagramPacket dataPacket) {
this.dataPacket = dataPacket;
}

public DatagramSocket getDataSender() {
return dataSender;
}

public void setDataSender(DatagramSocket dataSender) {
this.dataSender = dataSender;
}
}



* [b]接收数据[/b]

package eric.udp.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.Date;

public class UdpReceiver implements Runnable {
private SocketAddress source;
private DatagramPacket dataPacket;
private DatagramSocket dataReceiver;

public UdpReceiver() {}

public UdpReceiver(SocketAddress target, DatagramPacket dataPacket, DatagramSocket dataSender) {
this.source = target;
this.dataPacket = dataPacket;
this.dataReceiver = dataSender;
}

@Override
public void run() {
while (true) {
try {
Thread.sleep(50);
dataPacket.setSocketAddress(source);
// 该方法将阻塞线程,不断监听,直到收到数据
dataReceiver.receive(dataPacket);
System.out.println("receiver:" + dataPacket.getData()[0] + " ... ," + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
try {
byte[] bs = new byte[100];
InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 29191);
DatagramPacket dp = new DatagramPacket(bs, bs.length);
DatagramSocket ds = new DatagramSocket();
UdpReceiver receiver = new UdpReceiver(isa, dp, ds);
Thread t = new Thread(receiver);
t.start();
} catch (SocketException e) {
e.printStackTrace();
}
}

public SocketAddress getSource() {
return source;
}

public void setSource(SocketAddress source) {
this.source = source;
}

public DatagramPacket getDataPacket() {
return dataPacket;
}

public void setDataPacket(DatagramPacket dataPacket) {
this.dataPacket = dataPacket;
}

public DatagramSocket getDataReceiver() {
return dataReceiver;
}

public void setDataReceiver(DatagramSocket dataReceiver) {
this.dataReceiver = dataReceiver;
}
}



------
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值