Android UDP连接,接收端口,长时间监听的话会自动关闭吗?

wengnankai 2016-05-08 01:53:41
在项目中用到了UDP通讯,大部分情况下收发正常。
但是长时间情况下出现一些问题,我一分钟有心跳包发给服务端,服务端也可以收到,但是服务端发给客户端的数据包不能正常接收,接收端接收数据后发给接收数据队列去处理(CmdReceive.getInstance().AddRev(udpRxData))。

我怀疑有几种情况:
1、接收端端口关闭
2、接收数据处理线程挂了
3、路由器不发给android客户端

各位大牛,帮我进行分析下是什么问题,看看有没有解决方法

代码如下:

public class UDPComm {

private DatagramSocket socket;
DatagramPacket sPacket;

private byte[] udpRxData;
Future<?> rcvThread;

private static UDPComm single=null;
//静态工厂方法
public static UDPComm getInstance() {
if (single == null) {
single = new UDPComm();
}
return single;
}


public void InitSocket() {
if (socket == null) {
try {
socket = new DatagramSocket();
// socket.bind(null);
socket.setReuseAddress(true);

rcvThread = InvoiceApp.fixThreadPool.submit(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
byte[] rxData = new byte[2000];
DatagramPacket rcPkt = new DatagramPacket(rxData,
rxData.length);
while (true) {
//LogUtils.manprintf( "Manage UDP begin rcv:");
try {
socket.receive(rcPkt);

udpRxData = subBytes(rxData, 0, rcPkt.getLength());

CmdReceive.getInstance().AddRev(udpRxData);


ManageUtil.printByte(udpRxData, "rcvByte:" + udpRxData.length+" "+"rcv:");

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});

LogUtils.manprintf( "tx Manage udp ok");
} catch (SocketException e) {
// TODO Auto-generated catch block
LogUtils.manprintf( "SocketException:" + e);
e.printStackTrace();
}
}
}


public void DisConnectSocket()
{
try
{
if (socket != null)
{
socket.close();
socket = null;
}
if (sPacket != null)
sPacket = null;
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

private static byte[] subBytes(byte[] src, int begin, int count) {
byte[] bs = new byte[count];
for (int i = begin; i < begin + count; i++)
bs[i - begin] = src[i];
return bs;
}

public boolean Send(byte[] buf) {

if (!InvoiceApp.netState) {
return false;
}

byte[] txData = buf;
int remotePort = ManageParam.getServerPort();
String url = ManageParam.getServerUrl();

ManageUtil.printByte(txData, "send txData:");


sPacket = null;

try {
sPacket = new DatagramPacket(txData, txData.length,
InetAddress.getByName(url), remotePort);

} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
if (sPacket != null) {

try {
socket.send(sPacket);


try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
return false;
}

public void SendUDPComm(BaseStru obj,byte[] buf,boolean IsNeedResponse)
{

if(buf==null)
{
return;
}

SendBufStru stru=new CmdStru().new SendBufStru();
stru.buf=buf;
stru.Obj=obj;

if(IsNeedResponse)
{
ReSend.getInstance().AddReSend(stru);
}

if(UDPComm.getInstance().Send(stru.buf))
{
//LogUtils.manprintf("Send Data,FlowNum="+obj.FlowNum);
}

}

}

...全文
425 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunmenggyy 2016-05-11
  • 打赏
  • 举报
回复
引用 楼主 wengnankai 的回复:
在项目中用到了UDP通讯,大部分情况下收发正常。 但是长时间情况下出现一些问题,我一分钟有心跳包发给服务端,服务端也可以收到,但是服务端发给客户端的数据包不能正常接收,接收端接收数据后发给接收数据队列去处理(CmdReceive.getInstance().AddRev(udpRxData))。 我怀疑有几种情况: 1、接收端端口关闭 2、接收数据处理线程挂了 3、路由器不发给android客户端 各位大牛,帮我进行分析下是什么问题,看看有没有解决方法 代码如下:
public class UDPComm {

	private DatagramSocket socket;
	DatagramPacket sPacket;

	private byte[] udpRxData;
	Future<?> rcvThread;

    private static UDPComm single=null;  
    //静态工厂方法   
    public static UDPComm getInstance() {  
         if (single == null) {    
             single = new UDPComm();  
         }    
        return single;  
    }  
    
	
	public void InitSocket() {
		if (socket == null) {
			try {
				socket = new DatagramSocket();
				// socket.bind(null);
				socket.setReuseAddress(true);
			
				rcvThread = InvoiceApp.fixThreadPool.submit(new Runnable() {

					@Override
					public void run() {
						// TODO Auto-generated method stub
						byte[] rxData = new byte[2000];
						DatagramPacket rcPkt = new DatagramPacket(rxData,
								rxData.length);
						while (true) {
							//LogUtils.manprintf( "Manage UDP begin rcv:");
							try {
								socket.receive(rcPkt);
								
								udpRxData = subBytes(rxData, 0, rcPkt.getLength());
								
								CmdReceive.getInstance().AddRev(udpRxData);
								
		
								ManageUtil.printByte(udpRxData, "rcvByte:" + udpRxData.length+" "+"rcv:");
								
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
					}
				});

				LogUtils.manprintf( "tx Manage udp ok");
			} catch (SocketException e) {
				// TODO Auto-generated catch block
				LogUtils.manprintf( "SocketException:" + e);
				e.printStackTrace();
			}
		}
	}
	

	public void DisConnectSocket()
	{
		try
		{
			if (socket != null)
			{
				socket.close();
				socket = null;
			}
			if (sPacket != null)
				sPacket = null;
		}
		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		
	}
	
	private static byte[] subBytes(byte[] src, int begin, int count) {
		byte[] bs = new byte[count];
		for (int i = begin; i < begin + count; i++)
			bs[i - begin] = src[i];
		return bs;
	}
	
	public boolean Send(byte[] buf) {

		if (!InvoiceApp.netState) {
			return false;
		}
		
		byte[] txData = buf;
		int remotePort = ManageParam.getServerPort();
		String url = ManageParam.getServerUrl();
		
		ManageUtil.printByte(txData, "send txData:");
		
		
		sPacket = null;

		try {
			sPacket = new DatagramPacket(txData, txData.length,
					InetAddress.getByName(url), remotePort);

		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		if (sPacket != null) {
			
			try {
				socket.send(sPacket);

				
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				return true;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	
		}
		return false;
	}

	public void SendUDPComm(BaseStru obj,byte[] buf,boolean IsNeedResponse)
	{

		if(buf==null)
		{
			return;
		}
		
		SendBufStru stru=new CmdStru().new SendBufStru();
		stru.buf=buf;
		stru.Obj=obj;
	
		if(IsNeedResponse)
		{
			ReSend.getInstance().AddReSend(stru);
		}
		
		if(UDPComm.getInstance().Send(stru.buf))
		{
			//LogUtils.manprintf("Send Data,FlowNum="+obj.FlowNum);
		}
		
	}
    
}
不知道你们是怎么首发数据,是两个端口还是一个端口
wengnankai 2016-05-11
  • 打赏
  • 举报
回复
客户端有持续发数据到服务端
蒲锦_up 2016-05-09
  • 打赏
  • 举报
回复
直接打详细日志 不断的测试发送接受,看看到底是怎么回事。 手机关闭屏幕后,有些手机厂商做了处理,是不能接受socket消息的,也不能收到服务端的消息。
无业游农 2016-05-09
  • 打赏
  • 举报
回复
不会,,,,,
Rampage_SS 2016-05-09
  • 打赏
  • 举报
回复
服务器端发出的数据客户端收不到后,客户端有继续发送数据吗?
wengnankai 2016-05-09
  • 打赏
  • 举报
回复
我们是自己的产品,只是写个android放到终端上,不是手机。但是我们本地测试都是OK的。只是有部分的终端会出现问题,有没可能是接收处理线程挂了,导致数据包无法处理。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧