## 客户端与服务端基于UDP的通信工具 ##
转眼从学习安卓开发到工作已经一年的多了,以前都是遇到问题就在网上各种搜索代码结局额问题,可以说是踩过了很多巨人的肩膀了,从中也学习到了很多。
最近由于项目需要用UDP与服务器交互,该开始听到项目要使用这个协议时也是一头雾水,因为之前也没怎么在项目中接触过,所以在网上搜索了良久,最终根据综合了一些大神的代码和理解写了自己的一个基于UDP的与服务器交互的工具类,希望能让后来着少走点弯路吧。
因为与服务器交互收发数据是是个耗时过程,所以需要在子线程里面处理这些信息。
/**
* UDP模式发送数据到服务器
*/
public class UdpSendData extends Thread{
private static final int TIME_OUT = 3000; //设置超时为3秒
private static final int MAXTRIES = 5; //最大重发次数为5次
private static final String URL = ""; //URL地址
private static final int PORT = ; //服务器端口号
private String string;
private static final String TAG = "UdpSendData";
private String result;
private MyCallback callback;
public UdpSendData(String str ,MyCallback callback) {
string = str;
this.callback = callback;
}
@Override
public void run() {
byte[] data = string.getBytes();
try {
InetAddress address = InetAddress.getByName(URL);
DatagramSocket socket = new DatagramSocket(1985);
//打包发送信息
DatagramPacket sendPacket = new DatagramPacket(data, data.length, address, PORT);
//初始化一个空的接收包大小
byte dataSize[] = new byte[4 * 1024];
DatagramPacket receivePacket = new DatagramPacket(dataSize, dataSize.length);
int tries = 0; //超时重传
boolean receiveResponse = false;
do {
socket.send(sendPacket); //发送信息
socket.setSoTimeout(TIME_OUT);
try {
socket.receive(receivePacket); //接收信息
receiveResponse = true;
result = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
callback.success(result);
if (!receivePacket.getAddress().equals(address)) {
throw new IOException("收到一个未知源的数据包");
}
} catch (InterruptedIOException e) {
//当服务器接收不到信息或者接收信息超过3秒时,就向服务器重发请求
tries += 1;
}
} while ((!receiveResponse) && (tries <MAXTRIES));
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.pr e.printStackTrace();
}
}
}
而且接收消息也是属于耗时操作,所以我们需要当请求发送成
/*
*自定义回掉监听接口
*/
public interface MyCallback {
public void success(String result);
}
/**
*使用
*/
JsonObject params = new JsonObject();
params.addProperty("time", 2016);
String string = params.toString();
UdpSendData udpSendData = new UdpSendData(string, new MyCallback() {
@Override
public void success(String result) {
if (result.length() > 0) {
//更新UI到主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "成功退出", Toast.LENGTH_SHORT).show();
}
});
}
}
});
new Thread(udpSendData).start();
初次写博客,可能很多问题,希望对一些新手会有用处。最后加一句,这个功能因为是在联网状态下,所以配置文件里面得开启网络权限;