最近在 Android 开发的时候遇到一个问题,就是在服务器与客户端采用UDP协议通信的时候,如何判断一开始双方建立了连接。
“连接建立”很容易实现,服务器受到命令,返回类似ACK等信息,客户端使用 DatagramSocket.receive() 方法接收信息,即可知道双方已完成一次交互,通信成功。而要判断“连接失败”,即客户端在 DatagramSocket.receive() 这一步就会产生阻塞。
想了两个解决方法,一是设计一个定时器,规定 DatagramSocket.receive() 在一定时间内没有接收到消息则认为通信失败;一是客户端主动去扫描服务器的IP及端口,确认服务器是存在并启动的。
后来找了一下资料,发现 DatagramSocket 存在方法 setSoTimeout(),该方法已经帮我们设置好一个定时器,超过规定超时值,就会 抛出 SocketException。
以下是客户端的部分代码
private void sendMessage(String str) {
try {
DatagramSocket socket =new DatagramSocket();
InetAddress serverAddress = InetAddress.getByName(Settings.ipnum);
byte data[] = str.getBytes();
DatagramPacket outPacket = new DatagramPacket(data, data.length,
serverAddress, Settings.socketnum);
socket.send(outPacket);
System.out.println(new String (outPacket.getData()));
byte[] buffer = "ACK".getBytes();
DatagramPacket inPacket = new DatagramPacket(buffer, buffer.length);
try {
//设置超时时间,3秒
socket.setSoTimeout(3000);
socket.receive(inPacket);
System.out.println(new String (inPacket.getData()));
} catch (Exception e) {
Toast.makeText(ConnectActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
throw e;
} finally{
socket.close();
}
Intent intent = new Intent(ConnectActivity.this,ScreenActivity.class);
ConnectActivity.this.startActivity(intent);
ConnectActivity.this.finish();
Toast.makeText(ConnectActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
注:
public void setSoTimeout(int timeout) throws SocketException
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/liuruiqun/article/details/48089165