UDP 不阻塞的原因

原创 2013年12月03日 11:27:43


Android UDP 开发中,在接收数据的时候,有的手机无法阻塞???

原因:

不要在主线程中写相关UDP代码,将代码写到新建线程run函数中。


问题解决代码示例:

		new Thread(){
			public void run() 
			{
			
			// UDP服务器监听的端口
			Integer port = 8888;
			// 接收的字节大小,客户端发送的数据不能超过这个大小
			byte[] buf = new byte[1024];
			// 建立Socket连接
			DatagramSocket datagramSocket = null;
			if(datagramSocket == null)
			{
				try
				{
					datagramSocket = new DatagramSocket(null);
					datagramSocket.setReuseAddress(true);
					datagramSocket.bind(new InetSocketAddress(port));
				}
				catch (SocketException e)
				{
					e.printStackTrace();
				}
			}

			try
			{
				DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
				try
				{
					while (isOnResume)
					{
						// 准备接收数据
						datagramSocket.receive(datagramPacket);
						String result = new String(datagramPacket.getData() , datagramPacket.getOffset() , datagramPacket.getLength());
						Log.e("TAG", result);
//						Log.e("UDP Demo", datagramPacket.getAddress().getHostAddress().toString() + ":" + result);
					}
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			
		};}.start();


另外代码10行到23行的写法也一并解决了bind failed: EADDRINUSE (Address already in use)的错误。!!!!


王月星推荐


解决 recvfrom的 阻塞

UDP的多线程程序,一般开一个线程循环调用recvfrom接收消息,当程序中止的时候,如果这个线程阻塞在recvfrom调用,并且没有消息到达,则这个线程无法终止,造成资源泄露等问题。 这里终止这个...
  • angellove156
  • angellove156
  • 2016年06月16日 10:01
  • 4022

udp的close系统调用

在印象中,是只有tcp才需要调用close来关闭套接字描述符的,而udp需要与否是无关紧要的。这种直接的印象源于tcp是一个面向连接的协议,而udp则不是。因此对于一条连接,我们需要将其关闭而没有连接...
  • baidu20008
  • baidu20008
  • 2014年03月17日 20:00
  • 1140

Linux下UDP的连接程序示例(阻塞、非阻塞)

由于前面已有介绍,关于函数就不介绍了 /*server.c*/ #include #include #include #include #include #include #include...
  • CodeHeng
  • CodeHeng
  • 2014年12月11日 20:04
  • 1337

C++ Windows非阻塞UDP通信源码

UDP通信中,recvfrom或recv等函数默认都是阻塞方式进行的,即如果没有收到消息,那么程序会一直卡在recv()这个函数这里,使得该线程不能进行后续的操作。但有时候我们需要该线程在有UDP数据...
  • daybreak222
  • daybreak222
  • 2017年11月16日 09:44
  • 155

Java网络编程四 非阻塞通信UDP

转自 http://blog.csdn.net/alangdangjia/article/details/9065845 import java.io.BufferedReader;...
  • u010820135
  • u010820135
  • 2016年08月20日 17:24
  • 582

网络编程Socket之UDP(三)超时设置和非阻塞

前面遗留的两个问题: 1.客户
  • junjun150013652
  • junjun150013652
  • 2014年07月08日 19:42
  • 6855

UDP服务recvfrom函数设置非阻塞

基本概念: 方法一:通过fcntl函数将套接字设置为非阻塞模式。 方法二:通过套接字选项SO_RECVTIMEO设置超时。 方法一源码,编译:g++ udp_server.cpp -o serve...
  • daiyudong2020
  • daiyudong2020
  • 2017年04月10日 23:22
  • 3703

阻塞模式与非阻塞模式

使用socket编程实现数据传输的过程,通常的默认设置假设套接字是
  • hello_qingwen
  • hello_qingwen
  • 2014年07月12日 11:02
  • 1252

Android UDP通信的成败判断

最近在 Android 开发的时候遇到一个问题,就是在服务器与客户端采用UDP协议通信的时候,如何判断一开始双方建立了连接。 “连接建立”很容易实现,服务器受到命令,返回类似ACK等信息,客户端使用...
  • liuruiqun
  • liuruiqun
  • 2015年08月29日 18:05
  • 967

Windows网络编程之(一)Socket阻塞模式(TCP和UDP)

TCP通信Server#include #include static const int PORT = 7777; static const int BUFFER_LENGTH = 128 ;bo...
  • ww419793476
  • ww419793476
  • 2016年08月11日 00:04
  • 1533
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UDP 不阻塞的原因
举报原因:
原因补充:

(最多只允许输入30个字)