4

在阅读了几个关于网络的网页后,试图理解基本的网络,(我以前从未做过网络)我做了一些旨在制作一些简单聊天室的课程。以下课程将在下面发布:

ChatServer:http ://paste.strictfp.com/32591 ((最近编辑)创建等待人们连接到它的实际服务器,在这种情况下,通过端口 9045)

ChatSession:http ://paste.strictfp.com/32583 (当找到客户端时,从上面的服务器代码中,它会创建一个新会话,它基本上只是读取客户端发送的消息)

ChatClient:http://paste.strictfp.com/32584(允许客户端写入服务器)

ServerRunner:http://paste.strictfp.com/32585(运行服务器的主要方法)

ClientRunner:http ://paste.strictfp.com/32586 (运行客户端的主要方法,连接到服务器)

我知道上面的代码不是最好的,考虑到我没有添加任何检查来查看套接字/客户端是否断开连接或某些东西被中断。但话又说回来,这只是一种练习,以帮助我尝试掌握网络的概念。

因此,这 5 个类一起工作正常,但我有一个问题/疑虑,如果得到解答,将不胜感激:

如何从服务器向客户端发送消息?

我之所以问这个问题是因为我想制作一个简单的多人井字游戏,其中将有一个服务器和两个客户端(都代表玩家),基本上我的想法是无论何时客户点击按钮,我会向服务器发送一条消息。然后我会将消息发回给两个客户,以便修改他们的两个游戏。由于我缺乏网络知识,我对它的工作原理有点困惑。如果您不将我重定向到另一个 URL,我将不胜感激,除非非常非常简单,因为我更喜欢人们用最简单的术语向我解释它。如果有人可以帮助我,将不胜感激。

4

2 回答 2

1

“服务器”一词有两种含义,可能会令人困惑:

  1. 服务器是不在客户处的(即,它是每个客户/用户连接到的中心枢纽)
  2. 服务器是接收请求的那个。服务器从不发起对话,它们只总是响应传入的消息。

因此,您尝试做的是将您的服务器变成客户端(并且ChatClient将成为服务器)。

这就解释了为什么这个看似简单的任务如此困难:服务器不应该突然与客户端对话。现实世界的例子:你银行的一个职员突然出现在你家门口,试图在你家卖给你一些东西。奇怪,不是吗?

解决方案:

  1. 您可以让客户端每隔几分钟向服务器发送一条消息。消息将是“有什么新东西吗?”。这称为“轮询”。
  2. 您可以让客户端发送消息并让它等待答复。服务器无需立即回复消息。但是,您需要处理超时。但是客户可以发送一个“有什么新东西吗?” 然后等到收到回复。如果你把它移到一个线程中,客户端在等待答案时可以做其他事情。这是轮询,但它是被动的。
  3. 您可以使用像WebSocket这样的双向协议。
  4. 您可以将您的客户端变成一个真正的服务器:打开一个服务器套接字,让中央集线器知道端口号并让它连接到那里以更新您的客户端。虽然这可行,但它需要两个连接,而且它们有点贵。这适用于少量客户,但随着数量的增长,它最终会成为一个问题。
于 2012-08-24T13:42:14.147 回答
0

在更进一步之前,您必须决定的一件事是如何在普通 TCP 套接字之上构建应用程序级协议。这是关于哪一方发起对话,你想来回传递什么样的消息,等等。

然后下一个经常遇到的问题是决定消息本身的布局——它们是文本还是二进制,以及接收方如何知道它是否收到了完整的消息。这里通常的困惑是关于不理解 TCP 连接为您提供了双向字节流,并且必须弄清楚消息的开始和结束位置。这里的传统选项是:

  • 分隔消息 - 最适合基于文本的协议。最简单的形式是 line-is-a-message 表示法,其中 new-line 是您的分隔符。
  • 定长消息。最适合二进制。
  • 以长度为前缀的消息 - 您有一个固定长度的标头,告诉您后面有多少字节。
  • 自描述消息,如 s 表达式、XML 等。通常是文本。

希望这个对你有帮助。

于 2012-08-24T13:49:21.683 回答