我有一個客戶端/服務器應用程序。它們在接收數據時都使用異步調用。它與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);
}
}
}
問題IM具有做相對,從文件流讀取到的NetworkStream,我應該從FILESTREAM異步讀取和寫入同步到網絡流?
也因爲與上述例子中,第一次啓動()被調用,函數結束它返回到服務器交換機情況下和任何另外的(文件)數據隨後被擊中Packet returnPacket = Helper.ByteArrayToPacket(socketData.dataBuffer);
和示數: (
* EDIT 1 *
我不能使用任何外部庫或大量的代碼,這必須從地面向上建立。
這不是典型的客戶機 - 服務器應用程序,它更多的P2P但不完全,每個應用程序都有自己的服務器和客戶端在不同的線程運行,這允許多個應用到所有連接到對方建立一個...網絡。
客戶端告訴它正在發送一個文件給它的服務器,它不從服務器請求一個文件
你的框架限制是什麼?你使用的是2.0,3.5還是4.0? – 2011-01-12 00:05:13
.net 3.5。不超過總代碼的10%可以是一個框架,(目前的應用程序大約是10萬行代碼atm)。但是使用預先構建的框架可能對標記不利。 – Metalstorm 2011-01-12 00:09:21