使用阻塞TCP套接字时,我不必指定缓冲区大小.例如:
using (var client = new TcpClient())
{
client.Connect(ServerIp, ServerPort);
using (reader = new BinaryReader(client.GetStream()))
using (writer = new BinaryWriter(client.GetStream()))
{
var byteCount = reader.ReadInt32();
reader.ReadBytes(byteCount);
}
}
Run Code Online (Sandbox Code Playgroud)
注意远程主机如何发送任意数量的字节.
但是,当使用异步TCP套接字时,我需要创建一个缓冲区,从而硬编码最大大小:
var buffer = new byte[BufferSize];
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, callback, null);
Run Code Online (Sandbox Code Playgroud)
我可以简单地将缓冲区大小设置为1024字节.如果我只需要接收一小块数据,那就行了.但是,如果我需要接收10 MB的序列化对象呢?我可以将缓冲区大小设置为10*1024*1024 ......但是只要应用程序运行,就会浪费10 MB的RAM.这太傻了.
所以,我的问题是:如何使用异步TCP套接字有效地接收大块数据?
我想使用PHP套接字通过网络连接将JSON消息从PHP脚本发送到C#应用程序.
通常,对于二进制协议,每条消息的前4个字节必须是一个整数,表示消息的长度(多少字节).
在C#中,我为每条消息添加一个整数,该整数表示消息的长度,如下所示:
byte[] msgBytes = UTF8Encoding.UTF8.GetBytes("A JSON msg");
byte[] prefixBytes = BitConverter.GetBytes(msgBytes.Length);
byte[] msgToSend = new byte[prefixBytes.Length + msgBytes.Length];
Buffer.BlockCopy(prefixBytes, 0, msgToSend, 0, prefixBytes.Length);
Buffer.BlockCopy(msgBytes, 0, msgToSend, prefixBytes.Length, msgBytes.Length);
Run Code Online (Sandbox Code Playgroud)
据我所知,在PHP中,函数socket_send只接受字符串.那么,我怎么能在PHP 5.x中做同样的前缀呢?
更新:我发布了一个关于如何从网络套接字接收此类前缀数据的后续问题.