2011-12-28 11 views
7

私はクライアントアプリケーションとサーバーを持っています。socket.FileSendメソッドを使用して送信されたTCP経由でファイルを受信する方法

あるマシンから別のマシンにファイルを送信したいので、ソケットのようです。 FileSendメソッドが私が探しているものです。

しかし、FileReceiveメソッドがないので、ファイルを受け取るためにサーバー側で何をすべきですか? (私の問題は、ファイルのサイズが可変で、GBオーダーを作成できるバッファよりも大きいためです)

答えて

8

サーバ側ではTcpListenerを使用でき、クライアントが接続されるとチャンクでストリーミングし、ファイルに保存します。

class Program 
{ 
    static void Main() 
    { 
     var listener = new TcpListener(IPAddress.Loopback, 11000); 
     listener.Start(); 
     while (true) 
     { 
      using (var client = listener.AcceptTcpClient()) 
      using (var stream = client.GetStream()) 
      using (var output = File.Create("result.dat")) 
      { 
       Console.WriteLine("Client connected. Starting to receive the file"); 

       // read the file in chunks of 1KB 
       var buffer = new byte[1024]; 
       int bytesRead; 
       while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        output.Write(buffer, 0, bytesRead); 
       } 
      } 
     } 

    } 
} 

を限り送信は、あなたがSendFile方法のマニュアルに記載されている例を見てとることが懸念されます。

これは、WCFを使用するより堅牢なソリューションを検討するかもしれないと言われています。 HTTP経由でバイナリデータを送信するために特に最適化されたMTOMなどのプロトコルがあります。これは、非常に低レベルのソケットに頼ることに比べてはるかに堅牢なソリューションです。あなたは、既存のプロトコルで既に考慮されているファイル名、おそらくメタデータ、事などを処理する必要があります。

+0

TKSを使用する必要があります。私はほとんど同じコードを使用しましたが、stream.readの代わりにsocket.receiveを使用しました。 – RagnaRock

関連する問題