0

UDP クライアントが継続的に「Hello Server!」を送信します。2秒ごとにUDPサーバーに送信します(メッセージを大文字でエコーするだけです)。どちらも受け取ったものを印刷します。

私の問題は、常に最初にサーバーを実行し、次にクライアントを実行する必要があることです。クライアントを実行してからサーバーを実行すると、サーバーは何も受信しません。サーバーがいつでも起動し、クライアントからパケットを受信できるようにしたい. これどうやってするの?

UDP クライアント:

import java.io.*;
import java.net.*;

class UDPClient
{
   public static void main(String args[]) throws Exception
   {
      while(true) {
         DatagramSocket clientSocket = new DatagramSocket();
         InetAddress IPAddress = InetAddress.getByName("localhost");
         byte[] sendData = new byte[100];
         byte[] receiveData = new byte[100];
         String sentence = "Hello Server!";
         sendData = sentence.getBytes();
         DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
         clientSocket.send(sendPacket);
         DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
         clientSocket.receive(receivePacket);
         String modifiedSentence = new String(receivePacket.getData());
         System.out.println("FROM SERVER:" + modifiedSentence);
         clientSocket.close();
         Thread.sleep(2000);
      }

   }
}

UDP サーバー:

import java.io.*;
import java.net.*;

class UDPServer
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(9876);
            byte[] receiveData = new byte[100];
            byte[] sendData = new byte[100];
            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  String sentence = new String( receivePacket.getData());
                  System.out.println("RECEIVED: " + sentence);
                  InetAddress IPAddress = receivePacket.getAddress();
                  int port = receivePacket.getPort();
                  String capitalizedSentence = sentence.toUpperCase();
                  sendData = capitalizedSentence.getBytes();
                  DatagramPacket sendPacket =
                  new DatagramPacket(sendData, sendData.length, IPAddress, port);
                  serverSocket.send(sendPacket);
               }
      }
}
4

4 に答える 4

1

最初にクライアントを実行すると、「Hello server!」を送信しようとしたときに 初めて、結果は になりますPortUnreachableException。そのため、サーバーには何も送信されません。ソケット コードを try/catch でラップし、例外条件を無視します。

于 2012-10-17T07:35:15.590 に答える
1

最初にクライアントを実行すると、例外が発生PortUnreachableExceptionし、クライアント プログラムが終了します。これが起こらないようにするには、例外をキャッチして、クライアントが実行し続けるようにする必要があります。

試す:

import java.io.*;
import java.net.*;

class UDPClient
{
   public static void main(String args[]) throws Exception
   {
      while(true) {
         try{
         DatagramSocket clientSocket = new DatagramSocket();
         InetAddress IPAddress = InetAddress.getByName("localhost");
         byte[] sendData = new byte[100];
         byte[] receiveData = new byte[100];
         String sentence = "Hello Server!";
         sendData = sentence.getBytes();
         DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
         clientSocket.send(sendPacket);
         DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
         clientSocket.receive(receivePacket);
         String modifiedSentence = new String(receivePacket.getData());
         System.out.println("FROM SERVER:" + modifiedSentence);
         clientSocket.close();
         }
         catch (PortUnreachableException pe)
         {
           System.out.println("COULDN'T CONNECT TO SERVER:" + pe.getMessage());
         }
         catch (Exception ex)
         {
           System.out.println("COULDN'T CONNECT TO SERVER:" + ex.getMessage());
         }
         Thread.sleep(2000);
      }

   }
}
于 2012-10-17T07:43:12.123 に答える
0

さて、今朝です。もう一度見てみました。確かに、例外はスローされていません。実際の問題は、最初にクライアントを起動すると、サーバーが応答するのを待っているということです。ただし、サーバーは要求の受信に間に合うように起動されなかったため、サーバーから応答を受信することはありません。

     clientSocket.send(sendPacket); //send message which will not be received
     clientSocket.receive(receivePacket); //wait forever for a response to a request that was never heard

実用的な解決策は、クライアントをマルチスレッド化することです。一方のスレッドはリクエストの送信を担当し、もう一方のスレッドは着信応答の受信を担当します。これがハックな解決策です:

class UDPClient {
   public static void main(final String args[]) throws Exception {
      final InetAddress IPAddress = InetAddress.getByName("localhost");
      new Thread() {
         @Override
         public void run() {
            while (true) {
               DatagramSocket clientSocket = null;
               try {
                  clientSocket = new DatagramSocket();
                  byte[] sendData = new byte[100];
                  final String sentence = "Hello Server!";
                  sendData = sentence.getBytes();
                  final DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
                  clientSocket.send(sendPacket);
                  Thread.sleep(2000);
               } catch (final Exception e) {
                  e.printStackTrace();
               } finally {
                  clientSocket.close();
               }
            }
         }
      }.start();
      new Thread() {
         @Override
         public void run() {
            DatagramSocket clientSocket = null;
            try {
               clientSocket = new DatagramSocket();
            } catch (final SocketException e1) {
               e1.printStackTrace();
            }
            while (true) {
               try {
                  final byte[] receiveData = new byte[100];
                  final DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  clientSocket.receive(receivePacket);
                  final String modifiedSentence = new String(receivePacket.getData());
                  System.out.println("FROM SERVER:" + modifiedSentence);
               } catch (final Exception e) {
                  e.printStackTrace();
               }
            }
         }
      }.start();
   }

}
于 2012-10-17T18:32:03.657 に答える
0

できません。最初にサーバーを実行しないと、データグラムはビット バケットにドロップされます。唯一の軽減策は、クライアントが最初に connect() を呼び出すことです。この場合、クライアントは次のPortUnreachableException,送信でおそらく家に誰もいないことを伝えます。

于 2012-10-17T09:33:03.247 に答える