繁体   English   中英

使用C#中的套接字发送图像文件(大数据)

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM