【问题标题】:NetworkStream filename on receiving side接收端的 NetworkStream 文件名
【发布时间】:2013-05-20 18:29:22
【问题描述】:

我已经为此工作了两天,但我无法弄清楚。 我想通过 TCP 传输文件(服务器发送,客户端接收)。

我面临的问题是我想实现一种方法让接收方知道它正在获取的文件的文件名是什么。 到目前为止我的工作代码

    public void SendFile(string path, string IP)
    {
        TcpClient client = new TcpClient();
        client.Connect(IP, 1095);

        using (NetworkStream networkStream = client.GetStream())
        using (FileStream fileStream = File.OpenRead(path))
        {
            ASCIIEncoding asci = new ASCIIEncoding();
            byte[] b = asci.GetBytes(path);
            networkStream.Write(b, 0, b.Length);
            networkStream.Flush();
            fileStream.CopyTo(networkStream);
        }
        client.Close();
    }


    private void ListenForFile()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 1095);
        listener.Start();
        using (TcpClient incoming = listener.AcceptTcpClient())
        using (NetworkStream networkStream = incoming.GetStream())
        using (FileStream fileStream = File.OpenWrite(@pathName + @"\something.extension"))
        {
            networkStream.CopyTo(fileStream);
        }
        listener.Stop();
    }

【问题讨论】:

    标签: c# sockets file-transfer lan


    【解决方案1】:

    NetworkStream 没有文件的概念,它只是一个流字节缓冲区的类。您需要做的是想出某种形式的协议来将文件名发送给客户端。

    您可以先传输文件名和文件名的长度,然后传输文件大小,然后传输实际的文件内容。

    客户端可以读取文件名长度,读取文件名,读取文件大小,然后读取文件数据。

    【讨论】:

    • 那么,基本上是在只包含文件名的流之前发送一条消息?
    • 是的。您应该首先包含文件名的长度,否则您将不知道文件名在哪里停止以及实际文件从哪里开始,我也会传输数据大小,只是为了更好地衡量。
    • 感谢您的快速回复!我编辑了我的代码以首先发送带有文件名的 tcp 消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多