c#socket发送文件

时间:2015-07-19 10:00:05

标签: c# file sockets

我尝试使用SendFile方法https://msdn.microsoft.com/en-us/library/sx0a40c2(v=vs.110).aspx

 TcpClient client;
    private void Form1_Load(object sender, EventArgs e)
    {
        client = new TcpClient();
        client.Connect("10.0.0.1", 10);

        string fileName = @"C:\Users\itapi\Desktop\da.jpg";
        Console.WriteLine("Sending {0} to the host.", fileName);
        client.Client.SendFile(fileName);
    }

服务器代码:

    TcpListener listener;
    TcpClient cl;
    private void Form1_Load(object sender, EventArgs e)
    {
        listener = new TcpListener(IPAddress.Any, 10);
        listener.Start();
        cl = listener.AcceptTcpClient();




    }

我的问题是:我应该如何获取另一方的文件?我不想只使用网络流纯粹的套接字。 任何帮助都会得到解决

3 个答案:

答案 0 :(得分:3)

基本配方是:

  • 打开连接
  • 从连接中读取
  • 写入输出流(内存/文件/其他)

最简单的方法是使用NetworkStream

  

我不想只使用网络流纯粹的套接字

让我们再看一下Stream.CopyTo的内部:

private void InternalCopyTo(Stream destination, int bufferSize)
{
    int num;
    byte[] buffer = new byte[bufferSize];
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
    {
        destination.Write(buffer, 0, num);
    }
}

NetworkStream.Write

public override void Write(byte[] buffer, int offset, int size)
{
    // Insert Lots and Lots of checks and safety's here:

    streamSocket.Send(buffer, offset, size, SocketFlags.None);
}

另请注意NetworkStream负责正确的连接处理,正确关闭连接等。

简而言之,您可能不想使用NetworkStream只有一个很好的理由,那就是:我想完全实现同步,因为CopyTo实现是同步的。如果您使用async / await,即使这一点也存在很大争议。这适用于服务器环境中的高性能(c.q.许多连接)。

如果是这种情况,您可能需要在此处开始使用示例代码:https://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

答案 1 :(得分:0)

文件以字节形式发送。没有标题或任何东西。只是文件字节。

您可能应该使用File.Create打开要保存此文件的文件并使用new NetworkStream(mySocket).CopyTo(myFile)

  

我不想使用networkstream

这使得它变得更难。自己写一个流复制循环。

答案 2 :(得分:0)

除了以下代码之外,还必须关闭while循环的发送套接字才能退出。 blockCtr和totalReadBytes仅为诊断。

    private void btnReceive_Click(object sender, EventArgs e)
    {
        const int arSize = 100;
        byte[] buffer = new byte[arSize];

        string outPath = @"D:\temp\rxFile.jpg";
        Stream strm = new FileStream(outPath, FileMode.CreateNew);

        try
        {
            listener = new TcpListener(IPAddress.Any, 10);
            listener.Start();
            cl = listener.AcceptTcpClient();
            SocketError errorCode;
            int readBytes = -1;

            int blockCtr = 0;
            int totalReadBytes = 0;
            while (readBytes != 0)
            {
                readBytes = cl.Client.Receive(buffer, 0, arSize, SocketFlags.None, out errorCode);
                blockCtr++;
                totalReadBytes += readBytes;
                strm.Write(buffer, 0, readBytes);
            }
            strm.Close();

            MessageBox.Show("Received: " + totalReadBytes.ToString());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }