[英]Sending a image file using a socket in C# (Large Data)
我想发送大约一个大数据(图像)。 通过套接字连接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
。
这段代码使用了.Net 4中提供的CopyTo()
方法,但是您可以在早期版本中自己编写它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.