Python聊天服务器(一)

      对于镜像服务端来说,支持同时多个连接的能力是非常有用的,但是这也对服务端的实际功能没有多大的改变。每个客户端只跟服务端交互,甚至不跟其它客户端进行间接地交互。这是一个流行的模型,WEB 服务器和 MAIL 服务器都使用这种模型。

      这里还有另外的一个类型的服务端:用于连接每个客户端。对很多程序来说,他们关注的并不是服务端,而是还有什么人连接到它。在线聊天室和游戏是这种类型的流行应用。在这一章,我们将设计和建立一个简单的聊天服务端和客户端。

      最原始的聊天室可能是 Unix 系统的 wall 命令,它让你可以对登录到 Unix 系统的每个用户发送广播。 IRC 是最流行的基于 TCP/IP 聊天室软件。这里咱们要写的聊天软件跟 IRC 有很多共同的特性 ,尽管它跟 IRC 不兼容。

Python聊天服务端的设计

      在 IRC ,客户端连接到服务端的时候必须提供一个昵称:一个短字符串,用于标识想聊天的人。昵称必须单一,这样就不可以互相冒充了。我们的服务端将继续遵守这个约定。

      一个 IRC 服务端可以提供不限制数量的命名频道或房间,每个用户都可以加入任意数量的房间。我们的服务端将仅提供单一不命名的房间,所有连接的用户都将在这个房间里。

      在 IRC 客户端输入一行文字将广播到当前房间的其它人,除非文本是以斜杠开头。以斜杠开头的一行被服务端当作是一个命令。我们的服务端也将采取同样的方式处理。

      IRC 实现了一系列的服务端命令:例如,你可以用一个服务端命令来更换你的昵称,加入另一个房间,给另一个用户发送私信,或者给另一个用户发送文件。

      举个例子,如果你发送命令 /nick leonardr 到一个 IRC 服务端,你将尝试着把你的昵称从当前值改为 leonardr 。你的尝试能否成功,取决于是否已经有一个同样的名字在 IRC 服务端。

      我们的服务端将支持下面的三个命令,从 IRC 学来的并简化:

      /nick[nickname]: 正如上面所说的,这个命令尝试着去更换你的昵称。如果你的昵称是合格的并且没有被占用,你的昵称将被更改且通知房间。否则你将收到一个私人的错误消息。

      /quit[farewell message]: 这个命令断开用户与聊天服务端的连接。如果有告别消息的话,将会在房间里广播。

      /names: 这个命令检索聊天室里面的用户的昵称,昵称以空格隔开。

Python聊天服务端协议

      我们已经决定了一个特征集和设计,现在我们要为我们的服务端定义一个特定的协议。跟 SMTP, HTTP 和 IRC 协议类似,我们的协议也将在 TCP/IP 结构之上提供数据结构。当然了,比其它们其中的任意一个,我们的协议都是非常的简单。

      镜像服务端其实也定义了一个协议,虽然它很简单到我们都忽略了它。它的协议主要有三个简单的规定组成:

  1.       1、向服务端发送数行数据。
  2.       2、当你发送一个换行符时,服务端将先把数据反转,在数据末尾加上换行符,再将数据返回给你。
  3.       3、发送空白行意味着中断连接。

      聊天服务端协议相对来说复杂一点点,不过对比标准协议设计还是显得非常的简单。

 

行动中的假设协议

      一个好的方法来查找在定义协议时存在的问题是,写一个样本会话,来看一下到底客户端与服务端之间需要说些什么。这里有一个样本会话。在下面的会话中,当昵称 leonardr 连接到聊天室时,昵称 pnorton 早已在里面等候多时了。下面的图表展示了 leonardr 可能向服务端发送什么,服务端是怎么回应的,以及服务端是怎样根据 leonardr 的输入来发送给其它客户端(pnorton)信息的。(直接截图)

image

posted @ 2010-02-22 22:04  虾米狼  阅读(1936)  评论(0编辑  收藏  举报