使用C#(大数据)中的套接字发送图像文件
本文关键字:套接字 图像 文件 数据 使用 | 更新日期: 2023-09-27 17:59:23
我想发送一个大数据(图像)大约1MB通过套接字连接的文件
问题1
以下是我当前用于发送文本消息的套接字客户端的代码片段。。我如何修改它以发送文件?
NetworkStream serverStream = clientSocket.GetStream();
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(richTextBox1.Text+"$");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
问题2:套接字客户端和服务器需要进行哪些修改才能发送和获取大文件?
对于大数据部分,您可能需要某种按部分传输的方式。在您的代码片段中,您可以获得数组中的所有数据,如果文件足够大(或者至少不适合发送一个文件),则这是不可能的。
发送方将是这样的:
const int bufsize = 8192;
var buffer = new byte[bufsize];
NetworkStream ns = socket.GetStream();
using (var s = File.OpenRead("path"))
{
int actuallyRead;
while ((actuallyRead = s.Read(buffer, 0, bufsize)) > 0)
{
ns.Write(buffer, 0, actuallyRead);
}
}
ns.Flush();
接收站点是对称的。
套接字不关心您发送的是文本数据还是二进制数据。或者你寄了多少钱。如果有任何问题,那么它是在接收端,你没有发布的代码。一个典型的错误是忘记NetworkStream是流,而不是数据包序列。接收端的Read()调用可以返回任意数量的字节。它不会是您在Write()调用中写入的字节数,这取决于两台机器之间的路由器如何分解IP数据包以及接收器中缓冲了多少数据。您可能只调用Read一次就可以了,因为字符串很短。当你发送大量数据时,这肯定是行不通的。
您需要一个协议来帮助接收器确定何时接收到所有数据。一个简单的方法是首先发送数据的长度。然后,接收器可以首先读取该长度,然后知道持续调用read()多长时间才能获得其余数据。
您可以通过发送文件名来任意扩展此协议。等等。尽管到你完成的时候,你已经接近于重新发明FTP了。
如果你只想发送一个图像,并且不需要任何元数据,你可以使用这样的代码:
服务器:
var listener = new TcpListener(address, port);
listener.Start();
using (var incoming = listener.AcceptTcpClient())
using (var networkStream = incoming.GetStream())
using (var fileStream = File.OpenWrite(imagePath))
{
networkStream.CopyTo(fileStream);
}
listener.Stop();
客户端:
var client = new TcpClient();
client.Connect(address, port);
using (var networkStream = client.GetStream())
using (var fileStream = File.OpenRead(imagePath))
{
fileStream.CopyTo(networkStream);
}
client.Close();
如果要压缩文件,可以使用GZipStream
。
此代码使用CopyTo()
方法,该方法在.Net 4中可用,但您可以在早期版本中自己编写。