1.创建UDP套接字:
//打开UDP套接字
public void UDPServerActive(boolean isNeedActive){
if(isNeedActive) {
try {
if (mSocket != null) {
mSocket.close();
mSocket = null;
}
if (mRevPacket != null) {
mRevPacket = null;
}
mSocket = new DatagramSocket(mPort);
mRevPacket = new DatagramPacket(MyUdpData, 0, MyUdpData.length);
mSocket.setReuseAddress(true); // 允许重用地址
Recv.append("UDP套接字打开成功!\n\n");
} catch (Exception e) {
//端口可能已被占用!
mSocket = null;
mRevPacket = null;
Recv.append(e.getMessage());
Recv.append("UDP端口端口可能已被占用!\n\n");
}
UDPServerUDPRead();
}
else {
//先关闭UDP接收侦听线程
if (mRevThread != null)
{
mRevThread.interrupt();
}
if (mSocket != null) {
mSocket.close();
}
mRevPacket = null;
mSocket = null;
mRevThread = null;
}
}
2.绑定端口
Myip = getIP();
mPort = DEFAULT_PORT;
IPandPortV.append(Myip+":"+Integer.toString(mPort));
//初始化Socket,UDP,初始端口为39169,开启接收线程
UDPServerActive(true);
mPort的值等于指定的端口号,因为前面定义常量DEFAULT_PORT 值
private final static int DEFAULT_PORT = 39169;
3.接收数据
public void UDPServerUDPRead(){
if(mSocket == null) {
return;
}
mRevThread = new Thread() {
@Override
public void run() {
Recv.append("UDP开始侦听......\n\n");
while (!Thread.interrupted()) {
try {
// socket对象接收pack包,程序启动的时候,socket会一直处于阻塞状态,直到有信息传输进来
mSocket.receive(mRevPacket);
} catch (IOException e) {
continue;
}
4.处理数据
//开始侦听,数据接收处理程序在如下函数内添加
public void UDPServerUDPRead(){
if(mSocket == null) {
return;
}
mRevThread = new Thread() {
@Override
public void run() {
Recv.append("UDP开始侦听......\n\n");
while (!Thread.interrupted()) {
try {
// socket对象接收pack包,程序启动的时候,socket会一直处于阻塞状态,直到有信息传输进来
mSocket.receive(mRevPacket);
} catch (IOException e) {
continue;
}
//处理UDP接收到的数据,可以参考我们windows下delphi的例子
int p = 0;
int j = 0;
int m = 0;
String bytestr = "";
String CardNo16 = "";
String CardInfStr = "";
String CardNoStr= "";
String RemoteHostIP;
long cardno10=0; /*10进制卡号*/
//String CardNoStr= "";
long cardnum=0;
int RemotePort;
int length=0;
String SerialNum = "";
RemoteHostIP = mRevPacket.getAddress().getHostAddress(); /*数据来源IP */
RemotePort = mRevPacket.getPort(); /*数据来源端口*/
int len = mRevPacket.getLength();
if(len > 0) {
strls = "";
String strls1;
for (int i = 0; i < len; i++) {
strls1 = "0"+ Integer.toHexString(MyUdpData[i] & 0xff);
strls = strls + strls1.substring(strls1.length()-2);
if(i == (len-1))
{
break;
}
strls = strls + " ";
}
strls = strls + "\n";
//UDP发送
public void UDPServerUDPSendTo(String ipstr,int udpport,byte udpbuf[],int udpbuflen){
if(mSocket == null) {
return;
}
new Thread() {
@Override
public void run() {
try {
DatagramPacket mPacketls= new DatagramPacket(udpbuf,udpbuflen, InetAddress.getByName(ipstr), udpport);
mSocket.send(mPacketls);
} catch (IOException e) {
e.printStackTrace();
}
//处理UDP接收到的数据,可以参考我们windows下delphi的例子
}
}.start();
}
5.向指定IP发送
public void SendOrder(View view){
String RemotIpStr=RemotIpV.getText().toString();
String SendInfStr=InputstrV.getText().toString().replaceAll(" +", "");
//InputstrV.setText(SendInfStr);
if (SendInfStr.length()<1){
Recv.append("请输入发送信息!\n\n");
return;
}else if(!ipCheck(RemotIpStr)) {
Recv.append("IP地址错误!\n\n");
return;
}
//sendbuf[0] = (byte)0xa6;//返回连线读卡器的跨网关参数
int s = SendInfStr.length();
byte[] sendbuf = new byte[s/2]; // 创建字符数组,长度与字符串相同
int a = s / 2;
for (int i = 0; i < a; i++) {
sendbuf[i] = (byte)Integer.parseInt(SendInfStr.substring(i*2,i*2+2),16);//只有用Integer.parseInt才能杜绝大于128时的错误
// 逐个获取字符并存储到字符数组中
}
UDPServerUDPSendTo(RemotIpStr,mPort,sendbuf,a); //广播式发送
}
程序: