特定のポートから文字列メッセージを読み取る必要がある単純なクライアントと単純なudpサーバーを作成しました。これがUDPソケットです:
public class UDPServer {
// boolean variable defines if the infinite loop
// in startServer() runs or not
private boolean isSwitched = false;
private DatagramSocket socket = null;
public UDPServer(int port) throws SocketException {
socket = new DatagramSocket(port);
Logger.getLogger(Main.class.getName()).log(Level.INFO, "Server started! Bound to port: " + port);
}
//this method start the server and switches on the infinite loop to
// listen to the incoming UDP-packets
public void startServer() throws IOException {
this.isSwitched = true;
Logger.getLogger(Main.class.getName()).log(Level.INFO, "Server starts listening!");
while (isSwitched) {
byte[] size = new byte[30];
DatagramPacket dp = new DatagramPacket(size, size.length);
try {
System.out.println("Debug: receive loop started!");
socket.receive(dp);
System.out.println("Debug: Packet received after socket.receive!");
Thread requestDispatch = new Thread(new Request(dp.getData()));
requestDispatch.start();
} catch (SocketException ex) {
Logger.getLogger(Main.class.getName()).log(Level.INFO, "Stops listening on specified port!");
}
}
}
// this method stops the server from running
public void stopServer() {
this.isSwitched = false;
socket.close();
Logger.getLogger(Main.class.getName()).log(Level.INFO, "Server is shut down after last threads complete!");
}
}
リモートサーバーに展開し、プログラムのスイッチを入れます。サーバーは、リッスンを開始したことを出力して、socket.receive()ステージに到達します。次に、リモートクライアントからUDPメッセージを送信します。しかし、何も起こりません。udp-serverはそれ以上移動しません-保持しているだけで、メッセージを受信していないようです。tcpdumpを使用してポートをデバッグしようとしましたが、メッセージが必要なポートに届くことが示されています。しかし、Javaプログラムはそれらを受け取らないようです。リモートサーバーでこのコマンドを発行すると、次のようになります。
tcpdump udp port 50000
そして、それが書いたものであるいくつかのパケットを送信します:
12:53:40.823418 IP x.mobile.metro.com.42292 > y.mobile.metro.com.50000: UDP, length 28
12:53:43.362515 IP x.mobile.metro.com.48162 > y.mobile.metro.com.50000: UDP, length 28