我有服务器客户端应用程序。服务器和客户端可以使用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"需要是动态的。
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:2)
我想我明白你要完成什么,不幸的是,你所描述的方式是不可能的。在通过网络连接进行通信时,数据以字节发送,需要在另一侧重新组合在一起。使用序列化,您可以在流中发送实际对象,这些对象可以在另一端重新组合在一起。
如果您主要通过网络发送文本文件并且想要保留文件名,则可以考虑定义一个简单的类:
public class TransportFileInfo() {
string FileName { get; set; }
string FileContents { get; set; }
}
在侦听器线程中,您将收到与序列化的TransportFileInfo对应的字节,然后将其反序列化为其对象形式。此时,您可以访问FileName和FileContents来正确引导输出流。
如果你用谷歌搜索C#二进制序列化,我相信你会找到对你有用的信息。