我有一个客户端/服务器应用程序。它们在接收数据时都使用异步调用。它使用 TCP 构建,主要用于发送文件。
一个命令沿着一个套接字发送,然后将其“转换”为一个简单的开关盒并进行操作。如果客户端发送命令“SENDFILE”,我希望服务器能够输入一个调用一个函数的案例,该函数然后处理该套接字上的任何进一步数据并将其组合到一个文件中。
这是服务器端的 OnDataReceive 回调函数和 switch case:
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() 并且函数结束时它会返回到服务器开关盒,然后任何进一步的(文件)数据都会命中Packet returnPacket = Helper.ByteArrayToPacket(socketData.dataBuffer);
和错误:(
*编辑 1 *
我不能使用任何外部库或大量代码,这必须从头开始构建。
这不是典型的客户端-服务器应用程序,它更多的是 p2p,但不完全是,每个应用程序都有自己的服务器和客户端在不同的线程中运行,这允许多个应用程序相互连接,从而创建一个......网络。
客户端告诉服务器它正在向它发送文件,它不会从服务器请求文件