簡體   English   中英

C#文件讀取並通過套接字發送

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM