日期:2014-05-18  浏览次数:20702 次

javaUDP通讯,用同一端口收和发的问题。
需求是这样,我向另外一个系统发UDP心跳包,然后它看到我是从哪个端口发的,就会给我那个端口。然后它会跟我要数据,我查询出来数据以后,也再从原来那个端口发出去。

但是实际操作过程中,发现程序跑一会以后,对方发给我的数据包,有些就收不到了。

猜测可能是同一端口进行UDP收发所造成的。但是如何规避这个问题就非常不清楚了。而对方的系统现在没法修改,这种问题应该怎么解决呢?

PS,排除了是因为我这边数据处理慢的原因。因为我另外构建了一个线程池,接到数据以后是直接丢到线程池里面去处理的,并不占用数据接收的线程的时间。

大致代码如下,完全版贴不出来,只贴出部分:
public class WXUDPServer extends Thread {
public static void socket_open() {
try {
bo = true;
socket = new DatagramSocket(DEST_PORT);
} catch (SocketException e) {
// TODO Auto-generated catch block
Log.error_log.info(e.getMessage());
}
}

public void receive() {
try {
recvBuf = new byte[BYTE_LENGTH];
DatagramPacket recvPacket = new DatagramPacket(recvBuf,
recvBuf.length);
socket.receive(recvPacket);
byte[] temp = new byte[recvPacket.getLength()];
if (temp.length > 5) {
this.send(content, ip, port);
}
} catch (Exception e) {
e.printStackTrace();
Log.error_log.info(e.getMessage());
}
}

public static void send(byte[] content, String ip, int port)
{
if(socket == null){
socket_open();
}
try
{
outPacket=new DatagramPacket(content,content.length,InetAddress.getByName(ip),port);
socket.send(outPacket);
outPacket = new DatagramPacket(content,content.length);
socket.receive(outPacket);
Thread.sleep(10);
}catch(Exception e)
    {
e.printStackTrace();
Log.error_log.info(e.getMessage());
    }
}
/*
 * (non-Javadoc)
 * 
 * @see java.lang.Runnable#run()
 */
@Override
public void run() {
while (true) {
if (bo) {
receive();
} else {
socket_open();
}
}
}
}

------解决方案--------------------

------解决方案--------------------