PC服务端代码: 
接收信息: 解析出 IP 和端口号 :
public void startAccept(Selector selector){
try {

fileContext.appendFileContent(ServerMain.debugFile, "\n\nUDP Server.Start------------------------------------------------------------> UDP_Accept.java line 33\n");

System.out.println("UDP_Start");
int eventsCount = selector.select();
if(eventsCount > 0){
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();

while(iterator.hasNext()){
SelectionKey sk = iterator.next();
iterator.remove();

UDPhandlerSelectionKey(sk);
}

}
} catch (IOException e) {
e.printStackTrace();
}
}


private void UDPhandlerSelectionKey(SelectionKey selectionKey){
try {
if(selectionKey.isReadable()){
fileContext.appendFileContent(ServerMain.debugFile, "接收  UDP 信息 ==>UDP_Accept.java line 60  "+smf.format(new Date())+"\n");
DatagramChannel channel = (DatagramChannel)selectionKey.channel();
//清空缓存
receiveBuffer.clear();
// 得到接收的数据的地址
SocketAddress socketAddress = channel.receive(receiveBuffer);
String[] address = (socketAddress+"").substring(1, (socketAddress+"").length()).split("\\:");

UDP_IP = InetAddress.getByName(address[0]);
UDP_PORT = Integer.parseInt(address[1]);

receiveBuffer.flip();
// 接收到的 receiveUDPBuffer 输出
CharBuffer charBuffer = Charset.defaultCharset().decode(receiveBuffer);
String UDPmsg = charBuffer.toString();

/******解析收到的信息******/
fileContext.appendFileContent(ServerMain.debugFile, "接收信息 [ "+UDPmsg+" ] ==>UDP_Accept.java line 73  "+smf.format(new Date())+"\n");
// parseUDPMsg(UDPmsg);
System.out.println("UDP_receive:\t"+UDPmsg);
UDPMessage.init(UDP_IP, UDP_PORT, UDPmsg);
/*********************/

}
} catch (IOException e) {
e.printStackTrace();
}
}
PC端发送 UDP 信息private static void sendUDPMessage(LinkedList<ClientUtil> list,String msgsend){
try{

// 发送数据
for(ClientUtil c: list){
String filemsg = c.getIP()+":"+c.getPort()+"  | "+c.getSendID()+" | "+c.getUserType()+" | "+c.getZdep()+" | "+c.getDgc()+"\n";
filemsg = new ErrorChange().replaceString(filemsg);
fileContext.appendFileContent(ServerMain.sendFile, filemsg);

DatagramChannel channel =DatagramChannel.open();
ByteBuffer buffer = Charset.defaultCharset ().encode(msgsend);
channel.send(buffer, new InetSocketAddress(c.getIP(),c.getPort()));
}


}catch(UnknownHostException el){
fileContext.appendFileContent(ServerMain.debugFile, "无法连接到指定地址  ==>OperateClient.java line 422  "+smf.format(new Date())+"\n");
el.printStackTrace();
}catch(SocketException el){
fileContext.appendFileContent(ServerMain.debugFile, "无法打开指定端口    ==>OperateClient.java line 422  "+smf.format(new Date())+"\n");
el.printStackTrace();
}catch(IOException el){
fileContext.appendFileContent(ServerMain.debugFile, "发送数据失败    ==>OperateClient.java line 422  "+smf.format(new Date())+"\n");
el.printStackTrace();
}catch(Exception el){
el.printStackTrace();
}
}

解决方案 »

  1.   

    把超时时间加大试试
    原来有个项目用的UDP,3G老接收不到服务器的返回信息就是因为超时设了5秒,服务器的运算加上3G传输大于了5秒。
      

  2.   

    是不是长时间UDP发送闲置,导致你的路由器给你分配的端口发生变化了。是不是要隔几秒PING一下服务器,保持连接。不知道是不是这个原因。
      

  3.   

    立即发送 立即回复也收不到的, 可能是和 UDP的内网穿透有关, 不知道这个需要什么协议还是怎么设置 ..
      

  4.   

    这个话题被强烈关注中我的手机要跟电脑进行TCP/IP连接,但是不想输入电脑的IP地址,需要电脑端通过UDP定时广播自己的地址,让手机收到IP后能够自动连接。电脑端的代码已经写好,并测试通过,就等手机端的软件接收UDP了。
      

  5.   

    楼主,不知道你这个问题解决了没有,我现在也遇到 了和你同样的问题:客户端A在WIFI情况下,客户端B用的是手机移动网络,服务器S在公网下,A和S都能相互发送接收,但是B发给S,S能接到,S发给B时,B接不到,已经卡这半个多月了还是没有解决。也试过把B放在别的WIFI下,在有些WIFI下,B可能与S交互,但AB之间穿透时只能B向A传输。      
    有些WIFI还是如此。
    如果楼主解决了的话,能不能帮给兄弟指点指点,感激不尽,邮箱[email protected]