2012-03-06 12 views
2

私が書いたクライアントサーバーアプリケーションは動作するようですが、すべてのデータが毎回処理されるわけではないようです。Java - ソケット上のデータを送信するUDP。すべてのデータ

Eclipseのenvでローカルマシンでテストしています。

サーバー:

private void sendData() throws Exception 
{ 
    DatagramPacket data = new DatagramPacket(outgoingData, outgoingData.length, clientAddress, clientPort); 
    InputStream fis = new FileInputStream(responseData); 

    int a; 
    while((a = fis.read(outgoingData,0,512)) != -1) 
    { 
     serverSocket.send(data); 
    } 
} 

はクライアント:

private void receiveData() throws Exception 
{ 
    DatagramPacket receiveData = new DatagramPacket(incomingData, incomingData.length); 
    OutputStream fos = new FileOutputStream(new File("1"+data)); 
    while(true) 
    { 
     clientSocket.receive(receiveData); 
     fos.write(incomingData); 
    } 
} 

ときに、それは知っていたので、私はパケット長が512バイト以下であるかどうかをチェックする(真)whileループに他の場合は持っていましたブレーク;

私は今、私はほんの数分待ってからClient.javaアプリ

ファイルが転送を行いますが、元のファイルは、これまでに852キロバイトで、停止のためにそれは桶だったようだが、問題聖霊降臨祭があったことを考えていました私は777、800、850を持っていますが、決してそれのすべて。

+0

ストリームをフラッシュしましたか? –

+2

UDPは信頼できません。 UDPの仕様では、UDPは送信元から受信者へのパケットを取得するために "ベストエフォート"になりますが、パケットはドロップされ、受信者/送信者には通知されません。確実にデータを送信する必要がある場合は、何らかのパケットロス検出方式を実装するか、代わりにTCPを使用する必要があります。ローカルの意味で非常に多くのパケットを失っているのはちょっと奇妙ですが、ローカルのUDP接続が信頼できるものでなければならないという契約はありません。 – CodeBlind

+0

私はそれを理解していますが、まだ私はできるだけ多くを得るためにどのように手伝ってくれるのか理解しようとしています。 –

答えて

1

あなたのアプローチの基本的な問題は、UDPが配信を保証しないということです。 (UDPではなく、TCP)を使用する場合は、紛失したパケット、不整列のパケット、または複数回配信されたパケットを検出して処理するスキームを実装する必要があります。

はおそらく、ファイルを転送するためにTCPを使用する必要がありますWhen is it appropriate to use UDP instead of TCP?

0

を参照してください。あなたはおそらくパケットを失っています。なぜなら、ループ中にそれらを非常に速く送信しているからです。

int a; 
while((a = fis.read(outgoingData,0,512)) != -1) 
{ 
    serverSocket.send(data); 
} 

あなたが非常に速く送信しているので、正しい順序で受信するチャンスがあることは間違いありません。いくつかのパケットはおそらくそれのために失われるでしょう。

また、512バイトの固定サイズを送信してから最後に送信されるパケットは正確にはそのサイズではないため、「look wierd」というファイルの最後が表示されます。

関連する問題