我有一个带有UDP / TCP服务器和客户端的游戏。一个UDP端口(2406)用于更新客户端的位置,一个TCP端口(2407)用于聊天。这里的问题是2406。
当我在本地网络中播放客户端时,一切运行正常。但是当外部客户端想要加入时,我只收到第一个包(加入命令),之后只收到......没有。我(登录本地网络)无法看到外部播放器。但他们可以看到我。聊天适用于双方。所以它与DatagramSocket真正相关。我将尝试尽可能多地发布与UDP相关的信息,而不是TCP。
任何人都知道这里的问题是什么?
端口像UDP 2406,TCP 2407一样转发。
服务器,套接字:
DatagramSocket socket = new DatagramSocket(2406, InetAddress.getLocalHost());
ServerSocket serversocket_chat = new ServerSocket(2407, 0, InetAddress.getLocalHost());
服务器,接收线程:
byte[] buffer = new byte[1024];
DatagramPacket dp = new DatagramPacket(buffer, 1024);
while(true){
try{
this.socket.receive(dp);
String data = new String(dp.getData(), 0, dp.getLength()).trim();
String[] args = data.split(":");
String command = args[0];
String reply = null;
try{
reply = handleCommand(dp, command, args);
} catch( Exception e ){
System.err.println("Error while handling command: " + command);
e.printStackTrace();
}
if(reply != null){
reply += "\n";
DatagramPacket reply_packet = new DatagramPacket(reply.getBytes(), reply.length(), dp.getSocketAddress());
this.socket.send(reply_packet);
}
} catch (IOException e){
e.printStackTrace();
}
}
new Thread(chat_receive).start();
只要有人发送消息,方法handleCommand就会发现它是什么。每条消息都是一个从String派生的byte []。如果消息是“cj:Hello”,则handleCommand找到命令cs,username Hello。这是服务器收到的。在那之后,如果同一个人发送了什么,就不会收到任何东西。
客户端套接字:
private DatagramSocket socket;
private Socket socket_chat;
客户连接:
this.socket = new DatagramSocket();
this.socket_chat = new Socket(ip, port+1);
客户端发送:
private Runnable send = new Runnable() {
@Override
public void run() {
DatagramPacket dp;
String sendStringBuffered;
while(true){
if(sendString != null){
sendStringBuffered = sendString;
dp = new DatagramPacket(sendStringBuffered.getBytes(), sendStringBuffered.length(), ip, port);
try {
socket.send(dp);
} catch (IOException ex) {
Logger.getLogger(NewClient.class.getName()).log(Level.SEVERE, null, ex);
}
sendString = null;
}
}
}
};
答案 0 :(得分:0)
我想到了两件事:
为了进行系统的故障排除,请确保数据包真正使用数据包嗅探器/分析器(如tcpdump或wireshark)到达目的地