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 本身真正检测到应用程序消息结束的位置。
因此需要引入某种检测。通常你会添加一个后缀(新行、分号或其他)或长度 header.
在这种情况下,添加长度 header 更容易,因为可以在文件数据中找到所选后缀。
所以发送文件应该是这样的:
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);
}
在接收方,检查读取的 return 值很重要,因为内容可以成块出现:
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;
}
这就是我使用 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 本身真正检测到应用程序消息结束的位置。
因此需要引入某种检测。通常你会添加一个后缀(新行、分号或其他)或长度 header.
在这种情况下,添加长度 header 更容易,因为可以在文件数据中找到所选后缀。
所以发送文件应该是这样的:
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);
}
在接收方,检查读取的 return 值很重要,因为内容可以成块出现:
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;
}