案例 开发网络聊天系统
1. 教学目标
·了解网络信息系统的开发过程,能开发、部署简易的文字型网络聊天系统。
·通过开发简易网络聊天系统,进一步理解软件在信息系统中的作用。
·体会服务器、客户机等不同的运行环境对开发信息系统不同软件的影响。
2. 教学对象分析
学生对用Python编写网络程序已经比较熟悉,为本节的学习做好了知识储备。在日常的学习生活中,绝大部分学生都使用过聊天室或聊天软件,对网络聊天并不陌生,具有分析聊天系统基本结构的能力。不过,信息系统的服务端对学生来说仍相当于一个“黑匣子”,神秘且具有探索的价值。
3. 教学重点与难点
教学重点:开发网络聊天系统 需要明确的基本要素,能借助软件工具与平台开发简易的文字型网络聊天系统。
教学难点:网络信息系统的部署与调试。
4. 教学方法与教学手段
采用项目式教学法,学生3到4人分为一组进行。建议用2课时完成教学任务:第1课时完成“系统结构分析”“客户端程序编写”“服务器端程序编写”等内容;第2课时完成“部署服务器”“功能扩展”“总结反思”等内容。
5. 教学过程设计
教学环节
教师活动
学生活动
设计意图
复习提问
从交流时效上看,与网络聊天的主要区别是什么?
是非实时的信息交流方式,网络聊天是实时的信息交流方式。
引入新课
前面我们依据已有的系统,开发了可以收发的应用程序。除了,人们还会使用一些实时的信息收发系统,包括QQ、、网络聊天室等。今天,我们就开始试着开发一个简易的文字型网络聊天系统。
项目实施1——明确系统结构
项目实施1——明确系统结构
开发系统之前,先来分析一下系统结构(图3.3-4)。在这个系统中,有多个参与实时交流的
客户端用户。如果用户1给用户2发信息,那么,用户1的信息是直接发送到用户2的终端设备上的吗?
图3.3-4  网络聊天系统功能示意图
观察图3.3-4,明确以下信息。
·系统主要包括服务器和客户端。
网络连接失败
·系统面向的用户数:■ 多个用户 □ 单个用户
·从客户端来看,系统的主要功能包括:接收、发送信息。
·从服务器来看,系统的主要功能包括:接收、转发信息。
·客户端主要运行环境:在浏览器中运行。
·客户端软件:网页形式,可以随时停止使用。
·服务器软件:必须不间断地工作。
·聊天系统采用的网络 议:WebSocket协议。
教师引导:
系统功能分析清楚了,我们试着来开发系统,先从客户端开始。
项目实施2—— 开发客户端软件
教师引导:我们要开发的这个信息系统的客户端将借助浏览器来完成,所以编写客户端软
件的过程类似于编写网页。
明确客户端软件应该具备的具体功能。
■ 连接服务器 ■ 输入信息 ■ 发送信息
■ 接收信息  ■ 显示接收的信息
按照下面的代码,用HTML语言编写或改写网页形式的客户端。
【步骤1】
给学生发送有如下代码的文件。学生打开查看,教师解读。
<html>
<input id='host' value='127.0.0.1'></input>
<button onclick='con()'>连接</button>
<br/><br/>
<input id='msg'></input>
<button onclick='send()'>??</button>
<div id="output" ></div>
</html>
教师解读代码,学生根据理解将“??”填写完整。填写“发送”
以上代码负责展示网页中最基本的内容,要想完成复杂的操作,还需要编写JavaScript代码。
【步骤2】
将以下代码,粘贴到</html>前面。
<script>
function con()    #建立连接
{
ws = new WebSocket("ws://"+host.value+":8765/")
ws.onopen=function(evt){ writeToScreen("CONNECTED!")};
ws.onmessage=function(evt){ writeToScreen(evt.data);};
}
function send()  #发送信息
{
}
message=msg.value;
ws.send(message);
function writeToScreen(message) #显示信息
{
var pre = ateElement("p");
pre.innerHTML = message;
output.appendChild(pre);
}
</script>
教师解读:浏览器解析网页中的JavaScript代码时,就会采用WebSocket协议,连接服务器的 8765端口,然后等待用户发出信息或等待接收服务器转发的信息。不过,此时缺乏服务器端软件的支持,因此网页中的“连接”“发送”按钮还都不能使用。
项目实施3——开发服务器软件
给学生发送有如下代码的文件。学生打开查看,教师解读。
#code=utf-8
import asyncio
import websockets
cs = set()
async def talk(websocket, path):
try:
while True:
print('123')
<?1> (not websocket in cs):
cs.add(websocket)
msg='欢迎:'+_add
ress);
<?2>:
msg=_address)+'说:'+str(v());
await asyncio.wait([ws.send(msg) for ws in cs])
except Exception as err:
cs.remove(websocket);
start_server=websockets.serve(talk,'localhost', 8765)
_event_loop().run_until_complete(start_server)
_event_loop().run_forever()
教师解读代码,学生根据理解将“<?1>”改成“if”,将“<?2>”改成“else”。
程序中的talk方法采用了无限循环的方式,不断监听端口。如果有新的用户连入,就保存通信连接并用类似“欢迎”的内容通知其他用户;如果是新的聊天消息,就在消息前面加上发信人的网络地址,然后转发给所有人。
项目实施4——部署聊天系统
服务器软件和客户端软件组合在一起,就组合成聊天系统啦。
【步骤1】
在自己所用的计算机上运行服务器软件,然后运行客户端软件,试试能否正常访问本地的
服务器。
【步骤2】
小组内运行修改后的服务器软件,并公布那台计算机的网络地址。
提示:start_server=websockets.serve(talk, 'x', 8765)
其他同学运行client.html客户端,然后把地址改为公布的服务器的地址,试着进入聊天室进行聊天。运行结果类似图3.3-5。
图3.3-5  网络聊天示意图
项目实施5——用移动端聊天(拓展)
1. 手机若要参与刚刚开发的聊天系统,需要什么条件?如何实现?
2. 能否将开发的聊天系统和信息展示系统结合起来?如何实现?
3. 还能增加什么功能?如何实现?
通过问题形式,引导学生逐步完善软件的功能,进一步认识软件开发的过程。
总结、
反思
填写教科书第102页的项目实施报告,注意引导学生对网络协议的理解。
6. 相关资源
安装websockets编程库:pip install websockets。