从服务器读取二进制响应

时间:2013-11-20 16:22:09

标签: c# string tcp binary response

我正在使用TcpClient并将我的应用程序连接到服务器。这个服务器使用二进制数据序列化,所以我以二进制格式发送请求但得到这样的响应:

enter image description here 有我的代码:

TcpClient client = new TcpClient("173.240.5.1", 443);
        NetworkStream stream = client.GetStream();

        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

        byte[] sendBytes = encoding.GetBytes("YmFzZTY0IGVuY29kZWQgc3RyaW5n");

        stream.Write(sendBytes, 0, sendBytes.Length);

        byte[] bytes = new byte[client.ReceiveBufferSize];
        int response_int = stream.Read(bytes, 0, client.ReceiveBufferSize);


        Console.WriteLine(response_int);

请帮助解决问题并抱歉我的英语!

2 个答案:

答案 0 :(得分:2)

byte[] bytes = new byte[client.ReceiveBufferSize];
int response_int = stream.Read(bytes, 0, client.ReceiveBufferSize);

和(评论)“我得到了0回复”。

stream.Read的返回值是读取的字节数;重点:

  • 无法保证您将填充缓冲区
  • 如果它返回非正数,则无需阅读任何内容,从不可以阅读更多内容:流已关闭,最后是EOF等
  • 当没有关闭时,只保证(不考虑例外)读取至少一个字节(并且不超过规定的缓冲量) - 并且将阻塞直到它可以做到(或通过例外超时)
  • 收到正数时,不保证您有整个数据包/消息/帧等;你可以肯定地说它是“一些数据,这么多字节”;它也没有告诉你关于是否有更多数据即将到来,或者确实是否已经在NIC上缓存了更多数据

因此,如果它返回0,则没有数据。没有收到套接字已关闭。等待多久并不重要:它永远不会到来。如果不知道如何设置这些套接字,或者服务器正在做什么,我就不能多说了。但是,可以仅在一个方向上关闭插座(任一端都可以这样做)。听起来你连接的服务器已经关闭了它的发送套接字(你的接收套接字)而没有向你发送任何数据。

答案 1 :(得分:0)

响应似乎是用Mime64编写的。整个缓冲区只包含0.似乎你没有响应。你能否在stream.read之前等待(Thread.Sleep(500))。请注意,ReceiveBufferSize这是缓冲区大小,但不是收到的字节数