将参数传递给线程监听器

时间:2014-04-01 15:23:50

标签: c# tcp filestream

我有服务器客户端应用程序。服务器和客户端可以使用TCP和流发送和接收文件。文件传输在一个监听器中处理,该监听器在我的类中拥有它自己的线程,如下所示:

static void Main(string[] args)
{
    Thread thread = new Thread(new ThreadStart(Listen));
    thread.Start();
}

和Listen方法(简化):

private static void Listen()
{
    using (TcpClient tcpClient = tcpListener.AcceptTcpClient())
    {
        using (FileStream stream = new FileStream("fullFilePath.ext", FileMode.Create, FileAccess.ReadWrite))
        {
            // writing stream here
        }
    }
}

我使用(简化)发送文件流:

public void SendFile(string destination, int transferPort)
{
    using (TcpClient tcpClient = new TcpClient(destination, transferPort))
    {
        using (NetworkStream networkStream = tcpClient.GetStream())
        {
            // read bytes, write, and flush here
        }
    }
}

它工作正常,但我无法弄清楚如何传递参数,以便Listen()可以拥有动态的'我可以传递给它的论点。 例如," fullFilePath.ext"需要是动态的。

任何帮助都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

我想我明白你要完成什么,不幸的是,你所描述的方式是不可能的。在通过网络连接进行通信时,数据以字节发送,需要在另一侧重新组合在一起。使用序列化,您可以在流中发送实际对象,这些对象可以在另一端重新组合在一起。

如果您主要通过网络发送文本文件并且想要保留文件名,则可以考虑定义一个简单的类:

public class TransportFileInfo() {
    string FileName { get; set; }
    string FileContents { get; set; }
}

在侦听器线程中,您将收到与序列化的TransportFileInfo对应的字节,然后将其反序列化为其对象形式。此时,您可以访问FileName和FileContents来正确引导输出流。

如果你用谷歌搜索C#二进制序列化,我相信你会找到对你有用的信息。