我正在编写一个TCP聊天服务器(编程语言并不合适)。这是我的侄子的学校项目,所以它不会被发布,我问的所有问题都只是为了我的知识:)。 。它将支持的一些事情:
我知道如果我使用序列化,我可以很容易地完成上面的所有操作,只需将对象从客户端发送到服务器并返回。但是,如果我这样做,它将仅限于特定的编程语言(意味着用其他编程语言编写的客户端可能无法反序列化对象)。如何才能支持用其他语言编写的其他客户端?
离开我的头顶的一种方法是走向这个方向:服务器&客户通过发送消息进行通信&块(代替其他名称)。这就是我的意思:
每次客户端/服务器想要发送内容(文本消息或文件)时,它将首先发送一条简单的文本消息(换行符终止),其中包含它将发送的块的数量。例如:
命令4,20,30,40,50
command
类似于instant-message
或file
,4是要发送的块数,20是第一个块的字节大小,30个是第二,等等。
您如何看待以这种方式实现客户端/服务器通信?还有哪些更好的选择?
答案 0 :(得分:4)
你对序列化的看法是不正确的。您可以使用跨平台序列化协议,例如protocol buffers。这将使您的生活更轻松,并使您无法实施自己的通信协议。在我看来,最好找到一个现有的协议并实现它,而不是试图创建自己的协议。像xmodem这样简单的事情可以做到。
另外,为了避免客户端软件必须同时充当服务器和客户端(意味着必须解决对等识别问题),您可以让所有客户端通过集中式服务器进行通信。
答案 1 :(得分:1)
听起来不错,基本上你需要定义一个消息头(正如你所做的那样),以便接收者知道每个消息要读取多少字节。
我建议将消息大小作为第一个参数而不是可变长度命令字符串。这样,如果命令恰好通过2个单独的TCP数据包到达,则不存在歧义。
答案 2 :(得分:1)
我可能会在客户端之间传递XML;那很有用。
对于传递文件,可能只是传递一个字节缓冲区;我认为,如果你要在高端机器和低端机器之间进行操作,那就唯一有问题了。
答案 3 :(得分:1)
这里一个非常典型的解决方案是使用SOAP的Web服务。
答案 4 :(得分:1)
愚蠢的问题:为什么不通过TCP / IP使用TELNET协议进行聊天流,以及使用FTP over TCP / IP进行文件传输?