[英]c# file read and send over socket
這就是我使用NetworkStream
發送文件的方式。
private void go()
{
byte[] send = File.ReadAllBytes("example.txt");
ns.Write(send, 0, send.Length);
}
ns
當然是一個NetworkStream
。
現在,我想知道如何接收和讀取傳入的NetworkStream
?
我知道我需要指定一個緩沖區來讀取,
ns.Read(buffer,0,buffer.length).
但是應該在哪個緩沖區?
TCP是基於流的協議,這意味着沒有像UDP這樣的應用程序消息符號。 因此,您無法真正通過TCP本身檢測到應用程序消息的結尾。
因此,您需要引入某種檢測。 通常,您添加后綴(換行符,分號或其他內容)或長度標題。
在這種情況下,添加長度標頭會更容易,因為可以在文件數據中找到所選的后綴。
因此,發送文件如下所示:
private void SendFile(string fileName, NetworkStream ns)
{
var bytesToSend = File.ReadAllBytes(fileName);
var header = BitConverter.GetBytes(bytesToSend.Length);
ns.Write(header, 0, header.Length);
ns.Write(bytesToSend, 0, bytesToSend.Length);
}
在接收方,重要的是您檢查Read的返回值,因為內容可能成塊出現:
public byte[] ReadFile(NetworkStream ns)
{
var header = new byte[4];
var bytesLeft = 4;
var offset = 0;
// have to repeat as messages can come in chunks
while (bytesLeft > 0)
{
var bytesRead = ns.Read(header, offset, bytesLeft);
offset += bytesRead;
bytesLeft -= bytesRead;
}
bytesLeft = BitConverter.ToInt32(header, 0);
offset = 0;
var fileContents = new byte[bytesLeft];
// have to repeat as messages can come in chunks
while (bytesLeft > 0)
{
var bytesRead = ns.Read(fileContents, offset, bytesLeft);
offset += bytesRead;
bytesLeft -= bytesRead;
}
return fileContents;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.