码迷,mamicode.com
首页 > 移动开发 > 详细

Android UDP通信的成败判断

时间:2015-08-29 18:50:14      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:android   socket   udp   

最近在 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 错误。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android UDP通信的成败判断

标签:android   socket   udp   

原文地址:http://blog.csdn.net/liuruiqun/article/details/48089165

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!