【问题标题】:TCP Server not reading from socket untill objects disposedTCP 服务器不从套接字读取,直到对象被处理
【发布时间】:2009-11-24 14:16:08
【问题描述】:

请原谅我选择的措辞和/或混淆的术语,当谈到套接字编程时,我是个傻瓜。我正在尝试连接到 TCP 服务器,编写消息并处理响应。我使用以下代码:

Dim tcpClient As Sockets.TcpClient = New TcpClient()

tcpClient.Connect(hostname, 9080)

Dim networkStream As NetworkStream = tcpClient.GetStream()

If networkStream.CanWrite And networkStream.CanRead Then

    Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(body)
    networkStream.Write(sendBytes, 0, sendBytes.Length)

    Dim bytes(tcpClient.ReceiveBufferSize) As Byte
    networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

    Dim returndata As String = Encoding.ASCII.GetString(bytes)
End If

我可以看到服务器日志并注意到服务器只在我停止调试时从套接字读取然后它处理消息并发送响应(这对于我的客户端来说有点晚了不再听了)。

似乎需要先关闭 networkStream 对象。但是,如果我这样做,我将无法处理任何后续响应。我是否需要向已完成写入的服务器发出“信号”?我需要完全使用不同的模型吗?

【问题讨论】:

  • 您是否也编写了 TCP 服务器代码?如果是这样,您可以发布处理传入连接的代码吗?
  • 好点(因此赞成:))。我无权访问 TCP 服务器源。

标签: .net vb.net sockets tcp


【解决方案1】:

关闭/处置NetworkStream 应该没有必要,但我会质疑发送数据的方式。你写的服务器?我希望发送(和接收)数据的长度前缀或终止字符或短语。如果你只是这样写数据,服务器不知道它应该读取多少数据。

接收代码也是如此。您只是在尝试读取ReceiveBufferSize,而不是使用服务器发送给您的长度。

您确定您使用的协议不包含这些元素吗?

另外,请记住,Read 与大多数/所有其他 Stream 对象一样,不保证您将获得您请求的字节数。它将读取最多该字节数,并且函数的返回值指示读取了多少字节。您通常必须设置一个循环结构来获取特定数字。比如……

int bytesToRead = 1024; // sample
int totalBytesRead = 0;
int bytesRead = 0

while(bytesToRead > 0)
{
    bytesRead = stream.Read(buffer, totalBytesRead, bytesToRead);

    if(bytesRead == 0) throw new Exception("Connection closed");

    totalBytesRead += bytesRead;
    bytesToRead -= bytesRead;
}

这比典型的实现要详细一些,让您了解需要发生的事情。更典型的是:

int bytesToRead = 1024;
int bytesRead = 0;

while((bytesRead += stream.Read(buffer, bytesRead, bytesToRead - bytesRead) <= bytesToRead - bytesRead) { }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2019-04-02
    • 2017-09-19
    • 2014-09-24
    相关资源
    最近更新 更多