クライアント/サーバーアプリがあります。どちらもデータを受信するときに非同期呼び出しを使用します。TCPを使用したビルドであり、主にファイルの送信を目的としています。
コマンドはソケットに沿って送信され、ソケットは単純なスイッチケースに「変換」されてアクションを実行します。クライアントがコマンド「SENDFILE」を送信した場合、サーバーが関数を呼び出すケースを入力できるようにします。この関数は、そのソケットに沿ってさらにデータを処理し、それをファイルに結合します。
これは、サーバー側のOnDataReceiveコールバック関数とスイッチケースです。
public void OnDataReceived(IAsyncResult asyn)
{
SocketData socketData = (SocketData)asyn.AsyncState;
try
{
// Complete the BeginReceive() asynchronous call by EndReceive() method
// which will return the number of characters written to the stream
// by the client
socketData.m_currentSocket.EndReceive(asyn);
//Get packet dtata
Packet returnPacket = Helper.ByteArrayToPacket(socketData.dataBuffer);
switch (returnPacket.command)
{
case Command.SENDREQUEST: //Get ready for an incoming file
ここで、ネットワークストリームから非同期的に読み取り、ファイルストリームに同期的に書き込むクラス:そうですか?
public static void NetToFile(NetworkStream net, FileStream file)
{
var copier = new AsyncStreamCopier(net, file);
copier.Start();
}
public class AsyncStreamCopier
{
public event EventHandler Completed;
private readonly Stream input;
private readonly Stream output;
private byte[] buffer = new byte[Settings.BufferSize];
public AsyncStreamCopier(Stream input, Stream output)
{
this.input = input;
this.output = output;
}
public void Start()
{
GetNextChunk();
}
private void GetNextChunk()
{
input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null);
}
private void InputReadComplete(IAsyncResult ar)
{
// input read asynchronously completed
int bytesRead = input.EndRead(ar);
if (bytesRead == 0)
{
RaiseCompleted();
return;
}
// write synchronously
output.Write(buffer, 0, bytesRead);
// get next
GetNextChunk();
}
private void RaiseCompleted()
{
if (Completed != null)
{
Completed(this, EventArgs.Empty);
}
}
}
私が抱えている問題は、ファイルストリームからネットワークストリームへの読み取りとは逆のことです。ファイルストリームから非同期で読み取り、ネットワークストリームに同期的に書き込む必要がありますか?
また、上記の例では、Start()が最初に呼び出されて関数が終了すると、サーバーのswitchケースに戻り、それ以降の(ファイル)データがPacket returnPacket = Helper.ByteArrayToPacket(socketData.dataBuffer);
とエラー:(
*編集1*
外部ライブラリや大量のコードを使用することはできません。これはゼロから構築する必要があります。
これは典型的なクライアントサーバーアプリではなく、より多くのp2pですが、完全ではありません。各アプリには、異なるスレッドで実行される独自のサーバーとクライアントがあります。これにより、複数のアプリがすべて相互に接続して...ネットワークを作成できます。
クライアントはサーバーにファイルを送信していることを通知しますが、サーバーにファイルを要求しません