一.准备工作
private static DatagramSocket dSocket;
private static InetAddress inetAddress;//表示互联网协议(IP)地址
private static WifiManager.MulticastLock lock = BaseApplication.lock;
public static WifiManager.MulticastLock lock;
public static WifiManager wfm;
// 有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了。实例化一个WifiManager.MulticastLock
// 对象lock, 在调用广播发送、接收报文之前先调用lock.acquire()方法;
// 用完之后及时调用lock.release()释放资源,否决多次调用lock.acquire()方法,程序可能会崩.
wfm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
lock = wfm.createMulticastLock("wifi lcb");
InetAddress类
Java.net包中有InetAddress类的定义,InetAddress类的对象用于IP地址和域名,该类提供以下方法:
getByName(String s):获得一个InetAddress 类的对象,该对象中含有主机的IP地址和域名,该对象用如下格式表示它包含的信息:www.sina.com.cn/202.108.37.40;
String getHostName():获取InetAddress对象的域名;
String getHostAddress():获取InetAddress对象的IP地址;
getLocalHost():获得一个InetAddress对象,该对象含有本地机的域名和IP地址。
二.向服务器发送数据
public static String Send(String ip, int port, byte[] data) {
try {
//在给定主机名的情况下确定主机的IP地址,如果参数为null,获得的是本机的IP地址
inetAddress = InetAddress.getByName(ip);
} catch (UnknownHostException e) {
e.printStackTrace();
Logs.i("udputil 25 " + e);
}
try {
dSocket = new DatagramSocket();
dSocket.setSoTimeout(10000);// 如果对方连接状态10秒没有收到数据的话强制断开客户端
} catch (SocketException e) {
e.printStackTrace();
Logs.i("udputil 32 " + e);
}
// 创建一个DatagramPacket对象,用于发送数据。
// 参数一:要发送的数据 参数二:数据的长度 参数三:服务端的网络地址 参数四:服务器端端口号
DatagramPacket dPacket = new DatagramPacket(data, data.length, inetAddress, port);
try {
dSocket.send(dPacket);
Logs.i(dPacket.getAddress() + " udputil 45 " + dPacket.getPort());
// Logs.i("udputil 47 " + Arrays.toString(dPacket.getData()));
} catch (IOException e) {
e.printStackTrace();
Logs.i("udputil 50 " + e);
}
String s = Recevice();
return s;
}
三.从服务器接收数据
private static String Recevice() {
String result = "NO RESPONSE";
byte[] dataRec = new byte[66];
DatagramPacket dPacket = new DatagramPacket(dataRec, dataRec.length);
try {
lock.acquire();
dSocket.receive(dPacket);
lock.release();
result = new String(dPacket.getData());
// Logs.i("udputil 66 " + result + "\n" + Arrays.toString(dPacket.getData()));
} catch (IOException e) {
e.printStackTrace();
Logs.i("udputil 69 " + e);
}
dSocket.close();
return result;
}
四.DatagramSocket的方法
1. InputStream getInputStream() 从socket中获取输入流
2. OutputStream getOutputStream() 从socket中获取输出流
3. int getLocalPort() 获取本地的端口,端口用于监听服务器端的返回值,如果没绑定则为-1
4. int getPort() 获取连接的服务器端的连接端口,如果没连接则为0
5. InetAddress getInetAddress() 获取另一端的IP地址,toString后为/加上IP地址。
6. InetAddress getLocalAddress() 获取本地的IP地址,toString后如:/10.0.11.204
7. SocketAddress getRemoteSocketAddress()获取另一端的IP和端口,toString后如:/10.0.11.204:8808
8. SocketAddress getLocalSocketAddress() 获取本地的IP和端口,toString后如:/10.0.11.204:3513
9. Int getReceiveBufferSize() 获取接收端Socket的缓冲大小,默认是8kb.有get就有set。
10. Boolean isBound 是否此套接字绑定到本地地址和端口
五.整个UDP传输的大致流程
如果做为客户端,调用顺序应该是这样。
dSocket = new DatagramSocket();
//但作为服务器的话DatagramSocket(端口)要添加端口号
inetAddress = InetAddress.getByName(svrIpAddress);
DatagramPacket dPacket = new
DatagramPacket(byData, length, inetAddress, svrPort);
dSocket.send(dPacket);