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

时间:2011-06-18 09:39:21

标签: c# sockets

我想发送一个大数据(图像)约。通过套接字连接 1MB 文件

问题1

我目前用来发送短信的套接字客户端的代码片段..我怎么能修改这个来发送文件?

 NetworkStream serverStream = clientSocket.GetStream();
    byte[] outStream = System.Text.Encoding.ASCII.GetBytes(richTextBox1.Text+"$");
    serverStream.Write(outStream, 0, outStream.Length);
    serverStream.Flush();

问题2 :套接字客户端和服务器在发送和获取大文件时需要进行哪些修改?

3 个答案:

答案 0 :(得分:3)

对于大数据部分,您可能需要按部分进行某种传输。在您的代码段中,您将获得数组中的所有数据,如果文件足够大(或者如果它不仅仅是一个要发送的文件,则至少不适合)。

发送方将是这样的:

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();

接收网站只是对称的。

答案 1 :(得分:2)

如果发送文本或二进制数据,套接字不关心。或者您发送了多少。如果有任何问题,那么它是在接收端,你没有发布的代码。一个典型的错误是忘记NetworkStream是而不是数据包序列。接收端的Read()调用可以返回任意数量的字节。它不是您在Write()调用中写入的字节数,具体取决于两台计算机之间的路由器如何分解IP数据包以及接收器中缓冲的数据量。你可能会因为字符串很短而只调用一次Read。当你发送大量数据时,这绝对不会起作用。

您需要一个协议来帮助接收方确定何时收到所有数据。一种简单的方法是首先发送数据长度。接收器然后可以首先读取该长度,然后知道调用Read()多长时间来获取其余数据。

您可以通过发送文件名来任意扩展此协议。等等。虽然到你完成时,你已经接近重新发明了FTP。

答案 2 :(得分:2)

如果您只想发送图片并且不需要任何元数据,则可以使用以下代码:

服务器

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中可用,但您可以在早期版本中自行编写。