在阅读了几篇关于网络的网页之后,为了尝试理解基本的网络,(我以前从未做过网络)我做了一些课程,这些课程的目的是让聊天室变得简单一些。以下课程将发布在下面:
聊天服务器:http://paste.strictfp.com/32591 ((最近编辑)创建实际的服务器,等待人们通过端口9045连接到它)
聊天室:http://paste.strictfp.com/32583 (当从上面的服务器代码中找到一个客户机时,它会创建一个新会话,基本上只读取客户机发送的消息)
聊天室客户端:http://paste.strictfp.com/32584 (允许客户端写入服务器)
服务器运行程序:http://paste.strictfp.com/32585 (运行服务器的主要方法)
客户运行商:http://paste.strictfp.com/32586 (运行连接到服务器的客户机的主要方法)
我知道上面的代码不是最好的,考虑到我没有添加任何检查来查看套接字/客户端是否断开连接,或者是否有什么东西被中断。但话说回来,这只是一个练习,以帮助我尝试和掌握网络的概念。
所以这5门课合在一起很好,但我有一个问题/担心,如果你能回答,我将非常感激:
如何从服务器向客户端发送消息?
我问这个问题的原因是因为我想做一个简单的多人tic-tac-toe游戏,其中有一个服务器和两个客户端(都代表玩家),基本上我想的是,每当客户端点击按钮时,我都会向服务器发送一条消息。然后我会将消息发送回两个客户端,以便修改他们的两个游戏。我只是对它的工作原理有点困惑,因为我缺乏网络知识。如果你不把我重定向到另一个网址,我会很感激的,除非非常简单,因为我更喜欢人们用最简单的方式向我解释。如果有人能帮我,我将不胜感激。
2条答案
按热度按时间yduiuuwa1#
“服务器”一词有两种含义,可能会让人混淆:
服务器不在客户处(即,它是每个客户/用户连接到的中心集线器)
服务器是接收请求的服务器。服务器从不发起对话,它们总是对传入的消息做出响应。
因此,您要做的是将服务器变成客户机(以及
ChatClient
将成为服务器)。这就解释了为什么这项看似简单的任务如此困难:服务器不应该突然与客户机通信。现实世界的例子:你银行的一个职员突然出现在你家门口,想在家里卖给你一些东西。很奇怪,不是吗?
解决:
您可以让客户端每隔几分钟向服务器发送一条消息。信息应该是“有什么新东西吗?”。这称为“轮询”。
您可以让客户机发送一条消息,让它等待答案。服务器不需要立即回复消息。不过,你需要处理一些超时问题。但是客户可以发送一个“有什么新东西吗?”然后等到得到回复。如果您将其移动到一个线程中,那么客户机可以在等待答案时执行其他操作。这是投票,但它是被动的。
您可以使用像websocket这样的双向协议。
你可以把你的客户机变成一个真正的服务器:打开一个服务器套接字,让中心集线器知道端口号,然后让它连接到那里来更新你的客户机。虽然这是可行的,但它需要两个连接,而且它们有点贵。这对于少量的客户机很有效,但随着数量的增长,它最终会成为一个问题。
inb24sb22#
在进一步讨论之前,您必须决定的一件事是如何在普通tcp套接字之上构建应用程序级协议。这是关于哪一方发起对话,你想传递什么样的信息,等等。
然后,下一个通常棘手的问题是决定消息本身的布局——它们是文本还是二进制,以及接收方如何知道它是否得到了完整的消息。这里常见的混淆是不理解tcp连接提供了一个双向字节流,您必须找出消息的开始和结束位置。这里的传统选项有:
分隔消息-最适用于基于文本的协议。最简单的形式是行即消息表示法,其中新行是您的分隔符。
定长消息。最适合二进制。
长度前缀消息-您有一个固定长度的头,告诉多少字节将遵循。
自描述消息,如s表达式、xml等,通常是文本。
希望这有点帮助。