首先,我是网络新手,所以我可以在这里说愚蠢的事。 考虑使用套接字的客户端 - 服务器应用程序(如果重要的话,使用带有c#的.net)。
。
我的问题是如何正确设置缓冲区大小以进行读/写操作。
我应该这样做:byte[] buff = new byte[client.ReceiveBufferSize]
?
I am thinking of something like this:
Client sends data to the server(and the server will follow the same pattern)
byte[] bytesToSend=new byte[2048] //2048 to be standard for any command send by the client
bytes 0..1 ->command type
bytes 1..2047 ->command parameters
byte[] bytesToReceive=new byte[8]/byte[64]/byte[8192] //switch(command type)
但是......当服务器通知客户端而不发送数据时会发生什么? 完成我想要做的事情的正确方法是什么? 谢谢你的阅读。
答案 0 :(得分:1)
无论缓冲区的大小是多少,它应该只是数据的临时存储。阅读有关从二进制流中读取的内容:http://www.yoda.arachsys.com/csharp/readbinary.html
答案 1 :(得分:1)
我真的不明白你想要做什么,但我试着提出一些建议。您的字节数组和Socket.ReceiveBufferSize属性是两个不同的东西。缓冲区大小无关紧要。您应该使用足够大的字节数组来存储要发送或接收的数据。对于字节数组的大小,2048可能没问题,除非你想发送图像,非常大的文本等。我做了一些简单的客户端服务器编程,如果接收者知道要接收多少数据,我发现它更容易预先。因此,例如,您首先将字符串的长度发送为1或2个字节,然后使用utf8 encoding发送字符串。使用Encoding.GetByteCount方法获取所选编码的字符串大小(以字节为单位)。您应该使用Bitconverter中的方法将数字转换为二进制。我发现那些有用的,现在我希望,我会早点发现它们。要发送其他更复杂的数据类型,您应该将它们分解并一次发送一个字符串或数字。
答案 2 :(得分:1)
在设计客户端/服务器通信时,最好通过客户端/服务器介绍一些通信协议(基本上是一组规则,将发送/接收的格式)的概念。
这是通过网络交换可变大小消息的example
答案 3 :(得分:0)
您可以最简单地将 XML 视为您的通信协议,然后阅读套接字,直到空字节被重新加载。 (这是xml文档结尾的典型标记)。您可以通过两种方式实现此协议。
要解析并生成XML文档,您可以使用XMLDocument
类。你必须要阻止一些架构。但是,如果您希望将清晰的转换数据用作 XML ,则可以使用最简单的DataSet
。