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();
}
}
接收信息: 解析出 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();
}
}
原来有个项目用的UDP,3G老接收不到服务器的返回信息就是因为超时设了5秒,服务器的运算加上3G传输大于了5秒。
有些WIFI还是如此。
如果楼主解决了的话,能不能帮给兄弟指点指点,感激不尽,邮箱[email protected]