【发布时间】:2016-12-28 01:26:15
【问题描述】:
我不太明白TcpListener 和TcpClient 通信时如何共享一些功能。
假设运行以下代码(现在忽略同步):
服务器:
Dim server As New TcpListener(localAddr, port)
server.Start()
Dim client As TcpClient = server.AcceptTcpClient()
客户:
Dim client As New TcpClient
client.Connect(hostAddr, port)
并且连接成功建立。现在有两个TcpClient 实例——一个在服务器端,一个在客户端。但是,它们通过TcpClient.GetStream() 共享相同的网络流。
我有点困惑——当调用server.AcceptTcpClient() 时,客户端是否将自身及其所有属性传递给服务器?
在此之后对TcpClient 实例的任何更改如何?当连接关闭时,我在双方都调用它:
client.GetStream.Close()
client.Close()
但是我在客户端上遇到了 TcpClient.GetStream.Close() 的异常,它最新执行此代码,因为它告诉我客户端已经关闭(当上述代码在双方未完全同步时会发生这种情况)。
.SendBufferSize 和 .ReceiveBufferSize 属性呢?我需要在连接的两端都设置吗?
希望有人能解释一下TcpClient/Listener 类在通信过程中究竟是如何工作的,从而消除我的困惑——到目前为止,我还没有找到解释究竟发生了什么的文档。
【问题讨论】:
-
不一样的
NetworkStream。每个流都绑定到其TcpClient的底层Socket。 --Send/ReceiveBufferSize属性只是表示您希望 发送或接收的方式。更改它们没有多大用处,客户端/服务器上的不同也不会真正影响任何事情。 -
@VisualVincent 发送/接收属性是否在“server.AcceptTcpClient()”中发送?我不太明白你说的用处不大是什么意思...如果我打算交换大文件,那么我会增加它们吗?
-
没有发送任何内容。唯一同步的属性是
Connected属性。***BufferSize属性只是表示您每次调用NetworkStream.Read/Write时希望发送或接收的数量。引用the documentation:“SendBufferSize 属性获取或设置您希望在每次调用 NetworkStream.Write 方法时发送的字节数。” -
不应在单个
Write()调用中发送整个文件,而应将其拆分为数据包。BufferSize属性仅控制网络缓冲区。假设您有一个 8192 的缓冲区,并且您发送了 9192 字节的数据。这将需要NetworkStream发送前 8192 个字节,然后发送额外的 1000 个字节。一般来说,不需要更改这些属性。 -
我可以确认更改
Send/ReceiveBufferSize并没有太大区别。经过测试,发送/接收速度似乎没有显着差异 - 我和提问者之间的聊天信息。
标签: vb.net tcp tcpclient tcplistener