TcpClient 是单个连接使用吗?如何发送第二条消息?
Posted
技术标签:
【中文标题】TcpClient 是单个连接使用吗?如何发送第二条消息?【英文标题】:Is TcpClient a single connection use? How do I send a second message? 【发布时间】:2015-08-23 02:57:02 【问题描述】:我有一个可以连接到外部程序的 TcpClient 对象。我可以发送一条消息(xml 序列化消息)。但是一旦我关闭我的网络流,我的 TcpClient 就会关闭并处理。第二次尝试通过我的 TcpClient 发送消息时,我收到一个错误“无法访问已处置的对象,Net.Sockets.Socket”。
我是使用 TcpClient 的新手,但我的印象是我会与另一个程序连接一次,然后能够在我的程序的生命周期内来回传递消息,并在关闭我的程序之前简单地断开 TcpClient。
我能够发送多条消息的唯一方法是如果我新建 TcpClient,并在发送消息之前再次执行连接。这是发送多条消息的正确方式吗?我和我的经理只是对 TcpClient 有错误的印象吗?
我对 TcpClient 的另一个印象是,一旦连接,我就能够接收来自其他程序的消息。所以我的程序会坐在那里什么都不做,然后收到一条 TcpClient 消息(一些定义的 xml 消息),说明库存已更改。这可能吗,还是我需要设置一个 TcpListener 才能使该类型的功能起作用?
请不要让这个例子混淆你或我只是想以不同的方式传达我的印象的问题。 我印象的一个例子是电话交谈。 TcpClient 是电话,我通过拨打另一个电话号码建立连接。然后我将被连接并能够来回交谈。在我们中的一个人再次开始对话之前,可能会有几分钟的停顿。然后在工作日结束时挂断电话。
但是在使用 TcpClient 一段时间后,我得到的印象是这是对讲机的对话。我通过 TcpClient 连接,这是我按下对讲机按钮。我说话,网络流的关闭是我松开按钮。我可以听到对话另一方的人的回复,但是一旦我再次按下按钮,它就会改变频率,这是一个全新的对话,需要我new tcpClient。
编辑
每个说不要关闭流的人都是对的。我一直关闭流的原因是因为接收器软件会处理我的消息。但接收软件也在寻找用 ASCII STX 和 ETX 字符包装的消息。如果我包装了我的消息,然后将其发送出去,你会发现他们开始处理消息,而我的流仍然打开。
【问题讨论】:
不要关闭流。 如果我不关闭流,其他程序似乎不知道消息已发送并且坐在那里无所事事 没有消息这样的东西。这是一个无限的无边界字节流。接收器有错误。如果接收者有错误,请不要修改发送者。 我无法访问接收器代码,但我觉得他们正在循环读取直到字节 = 0。在不关闭网络流的情况下如何向他们发送字节 0? @Peacock 我认为您应该将上面的“编辑”部分添加为答案,然后接受它。这是标准做法,因此您可以知道问题何时已解决。 【参考方案1】:每个说不要关闭流的人都是对的。
我一直关闭流的原因是接收软件会处理我的消息。但是,如果我的消息包含在 ASCII “STX”和“ETX”字符中,接收软件也会处理它。
我最终的问题是对 TcpClient 有点无知,对接收软件的协议有点无知。
【讨论】:
以上是关于TcpClient 是单个连接使用吗?如何发送第二条消息?的主要内容,如果未能解决你的问题,请参考以下文章