0

特定のポートから文字列メッセージを読み取る必要がある単純なクライアントと単純な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
4

2 に答える 2

1

サーバーコードをnetcatを使用してローカルでテストしましたが、問題なく動作するため、問題は別の場所にある必要があります。実際にUDPパケットを送信していますか?リモートサーバーでtcpdumpを実行しましたか?そうでない場合は、パケットがフィルタリングされる可能性があります。

于 2013-02-22T10:42:05.283 に答える
1

OK、質問は解決しました。問題は次のとおりです。

Red Hatlinuxのファイアウォール。必要なポートのスイッチを正常にオフにしました。

于 2013-02-22T11:51:09.657 に答える