0

ファイルをUDPサーバーに転送するUDPクライアントを作成しています。最初に、UDP パケットで送信されるバッファの長さで割ったファイルの長さを測定して、送信する必要があるパケットの数を取得しようとします。最初にこの番号をサーバーに送信して確認します。しかし、サーバー側では、受信パケットのバイト配列から初期番号への変換に失敗しました。誰でも私を助けてくれますか?クライアント側の私のコードは次のとおりです。

    DatagramSocket socket=new DatagramSocket(); 
    File f = new File(filename);
long fileSize = f.length();
    byte[] buffer = new byte[16384]; 
    long packetNumber = (fileSize/(buffer.length))+1;
    DatagramPacket sendPacket=new DatagramPacket(buffer,buffer.length,addr,srvPort);
    String str=Long.toString(packetNumber);
    buffer = str.getBytes();
    socket.send(sendPacket);

サーバー側のコードは次のとおりです。

    DatagramSocket socket=new DatagramSocket(port);     
byte[] buffer=new byte[16384];
    DatagramPacket receivePacket=new DatagramPacket(buffer, buffer.length);
    while(true)
        {
        socket.receive(receivePacket);
        if (receivePacket.getData().toString().trim()!=null)            
        {

        String str=receivePacket.getData().toString();
        System.out.println(str);
        long pcount=Long.parseLong(str);
                    System.out.println(pcount+" packets to be received.");
                    break;
                    }
                    }

しかし、サーバー側では、変数 pcount は常に解決されず、str を出力しようとすると、"[B@60991f" または sth が出力されます。

4

2 に答える 2

1

toString() を使用しても何も得られませbyte arrayん。を使用してバイト配列から文字列を再構築する必要がありますnew String

于 2012-06-04T09:31:18.637 に答える
1

このコードは意味がありません。

ほとんどのネットワークでは、534 バイトを超えるデータグラムを確実に送信することはできません。

現在、バッファに何も入れていないため、16384 バイトのゼロ値を送信しています。代わりに、DatagramPacket を作成した後に新しいバッファを作成しています。したがって、まだ何も送信していません。

そして、あなたはまだ何も受け取っていません。String.trim() の結果を null にすることはできません。各 receive() の前に DatagramPacket のバイト配列をリセットする必要があります。これは、実際に受信したパケットのサイズに縮小するためです。リセットしない限り、バイト配列はどんどん小さくなっていきます。バイト配列に対する toString() の結果にはその内容が含まれないため、解析しても意味がありません。

いくつかの基本的な Java プログラミングの概念を学習する必要があります。多すぎてここで答えることができません。

于 2012-06-04T09:42:02.377 に答える