Android UDP通信的成败判断
来源:互联网 发布:詹姆斯本赛季数据 编辑:程序博客网 时间:2024/05/17 02:03
最近在 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
启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,对此 DatagramSocket 调用 receive() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 DatagramSocket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。
参数:
timeout - 指定的以毫秒为单位的超时值。
抛出:
SocketException - 如果底层协议出现错误,例如 UDP 错误。
0 0
- Android UDP通信的成败判断
- android两台真机的sock udp 通信
- Android Socket UDP通信的简单演示
- android UDP通信
- android UDP通信
- android UDP通信问题
- android网络通信------UDP
- Android UDP通信
- android UDP通信
- Android实现UDP通信
- Android中UDP通信
- Android:Socket UDP通信
- android UDP通信
- ACE的UDP通信
- Java的UDP通信
- UDP通信的问题
- ios 的udp 通信
- ios 的udp 通信
- 分享四
- Linux忘记root密码解决办法
- pat 1001. A+B Format
- windows 绕过开机密码
- oracle log LogMiner 日志分析
- Android UDP通信的成败判断
- UI手势二
- 阿里笔试——跳格子问题
- 是时候抛弃 Eclipse 转向 IntelliJ IDEA了
- 详解coredump
- 欢迎使用CSDN-markdown编辑器
- 添加自定义的protocol时出错:
- nyoj 773 开方数【快速幂】
- matlab一些小技巧