0

オブジェクトを UDP パケットとして送信し、サーバーでオブジェクトを受信したいと考えています。クライアント側に理解してもらいましたが、サーバーにデータグラムを正しく読み込ませることができません。

クライアントコード:

public void sendMessage() {
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();

        try {
            ObjectOutput oo = new ObjectOutputStream(bStream);
            oo.writeObject(asset);
            // Send it

            byte[] serializedMessage = bStream.toByteArray();

            DatagramPacket sendPacket = new DatagramPacket(serializedMessage,
                    serializedMessage.length, ipAddress, sPort);
            clientSocket.send(sendPacket);
            oo.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

サーバーは試行に失敗しました。

public void startServer() {
    try {
         serverSocket = new DatagramSocket(this.serverPort);
         serverSocket.receive(new DatagramPacket()); /*Code fails here, I realise
         * the constructor does not have input, but I can not figure out how to init
         *a buffer whose size I do not know beforehand.
         */
       this.threadPool.execute(new QueryTask(packet));
    } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
        }
}

次の質問を使用して、Java で UDP を使用してネットワーク経由でオブジェクトを送信しましたが、オブジェクトをどのように受信したかは示されませんでした。

質問 2: パケットを受信して​​解析したら、新しいスレッドを作成する方がよいですか、それとも、Datagrampacket を介して DatagramSocket を使用して新しいスレッドを作成する必要がありますか?

前もって感謝します。

4

2 に答える 2

2

受信すると予想される最大パケットよりも 1 大きいバッファを作成します。そのサイズのパケットを受け取った場合、それはオーバーフローです。受信するたびに DatagramPacket の長さを再初期化する必要があることに注意してください。そうしないと、これまでに受信した最小のデータグラムに縮小し続けます。

パケットを十分に迅速に処理できる場合は、UDP でスレッドをまったく必要とせず、処理する接続がありません。

于 2012-10-18T07:27:33.643 に答える
1

すでに見たように、データグラムパケットには書き込み用のバッファが必要です。インテントデータにちょうど十分な大きさのバッファを作成します(UDPはIPV4に65K、IPV6に4Gを指定します)。そして、私があなたなら、java.ioのシリアル化は、クラスが変更されるたびに(またはコンパイラーが変更されることもある)中断されるため、使用しません。JSON(jackson / gsonを使用)、XML、protobufなどのより堅牢なシリアル化手段を使用する

于 2012-10-18T07:24:49.887 に答える