版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10单元网络编程任务10.1简易聊天程序任务10.2遥控小画家学习目标知识目标技能目标素质目标
了解计算机网络的概念。
了解TCP/IP及网络协议分层。
掌握IP地址和端口的含义。
掌握Socket网络编程基本原理和流程步骤。
能够使用Socket开发基本的网络客户端和服务器端应用。
能够区分TCP和UDP两种编程模型的使用场景。
能够使用线程实现网络数据包的收发工作。
培养标准化的编码规范能力。
培养创新能力以及分析问题和解决问题的能力。
培养团队意识和沟通能力。
培养知识产权和数据安全意识。教学内容任务10.1简易聊天程序一、任务描述在一台计算机上同时运行服务器端A和客户端B,模拟实现两个人的聊天过程。B运行后自动连接到A,并向A发送文字信息。A收到后,回复信息给B,以此重复,直到B发送给A的内容是“bye”时,双方通信结束。
AB二、相关知识1.计算机网络的诞生早期随着个人计算机的普及,计算机之间数据交互的过程越来越受到重视,最初,两台计算机之间交互数据的过程相当烦琐。计算机网络通信技术的发展(即计算机与计算机之间的通信线路连接),逐步解决了这个问题,这样人们可以很轻松地即时读取另一台计算机中的数据,从而极大地缩短了传输数据的时间。二、相关知识两个人使用同一种语言交谈,他们必然遵循某种特定“规则”(协议,比如汉语的语法就是一种协议)。两台计算机可以借助TCP/IP协议规则进行通信,以便互发数据。2.TCP/IP网络通信协议计算机收发数据通信的过程,与人们在生活中的“信件”收发相似,这也是TCP/IP协议的基本原理二、相关知识两个人使用同一种语言交谈,他们必然遵循某种特定“规则”(协议,比如汉语的语法就是一种协议)。两台计算机可以借助TCP/IP协议规则进行通信,以便互发数据。2.TCP/IP网络通信协议(1)写好信的内容并放入信封,对应图中的步骤①(2)在信封上写上收信人,对应图中的步骤②(3)在信封上写上收信地址,对应图中的步骤③(4)将信封交给写信人所在地的邮局,对应图中的步骤④(5)收信人所在地的邮局收到信件,对应图中的步骤⑤(6)邮局将信件送往收信地址,对应图中的步骤⑥(7)邮局工作人员将信件转交到收信人,对应图中的步骤⑦(8)收信人拆开信封并阅读信件内容,对应图中的步骤⑧二、相关知识通过“姓名”或“身份证号”可以标识社会中的每一个人,网络中的计算机也需要通过某种特定手段来标识,这就是IP地址。为了在一台机器上识别是哪个程序发送或接收的数据,使用端口号来对应一个唯一的程序,类似于公司内部的电话分机号码。3.IP地址和端口二、相关知识Socket看作一种网络间不同计算机上的进程通信的一种方法,简化了应用层的网络通信编程。Socket会以符合指定的协议格式组织数据进行收发工作,这些可以通过调用用socker库方便地完成。4.Socket网络编程在服务器端:(1)创建套接字并绑定到本地IP地址与端口s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind()(2)开始监听连接s.listen()(3)接受客户端的连接请求s.accept()(4)接收传来的数据,或者发送数据给对方s.recv()和s.sendall()(5)传输完毕后,关闭套接字s.close()在客户端:(1)创建套接字,连接服务器地址s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect()(2)连接后发送数据和接收数据s.sendall()和s.recv()(3)传输完毕后,关闭套接字s.close()三、任务分析
本任务首先要启动服务器端A,然后启动客户端B并建立到服务器端的通信连接。连接之后,服务器端和客户端各自持有一个到对方的socket对象,并通过socket对象来收发数据。假定B连接到A后,B先向A发送一条信息,当B接收到A的回复信息后,整个通信过程就宣告结束。当然,也可以根据需要调整A、B互发消息的步骤。四、任务实现(1)在PyCharm中,选择“File”→“NewProject…”,在弹出的对话框中将项目命名为“chapter10”,单击“Create”按钮,创建新项目。(2)在PyCharm中,右击左侧列表中的项目名称“chapter10”,选择“New”→“PythonFile”,在弹出的对话框中将文件命名为“ServerA.py”,按“Enter”键,进入代码编辑界面。(3)在新建的ServerA.py文件中,导入socket库,设定服务器端监听的IP地址和端口,然后创建一个绑定IP地址和端口的socket对象,再通过listen()启动对端口的监听,调用accept()等待客户端的连接。importsocketip_port=('',9999)sock=socket.socket() #创建套接字sock.bind(ip_port) #绑定服务地址sock.listen(5) #开始监听连接请求print('启动socket服务,等待客户端连接...')conn,address=sock.accept() #等待连接,此处会自动阻塞四、任务实现(4)当客户端连接过来后,需要使用conn来接收客户端发送过来的数据,也可以将数据发送给客户端。下面的代码用于实现服务器端收到客户端的数据后,回送一个“bye”字符串,然后关闭与客户端的连接,结束通信。至此,ServerA.py的代码就完成了。(5)在PyCharm中,右击左侧列表中的项目名称“chapter10”,选择“New”→“PythonFile”,在弹出的对话框中将文件命名为“ClientB.py”,按“Enter”键,进入代码编辑界面。data=conn.recv(1024).decode() #接收客户端信息,1024代表接收缓冲区大小print("来自%s的客户端向你发来信息:%s"%(address,data))conn.sendall('bye'.encode()) #返回信息给客户端conn.close() #关闭连接四、任务实现(6)在新建的ClientB.py文件中,同样导入socket库,设定需要连接的服务器端IP地址和端口(取决于A所在计算机的IP地址和监听的端口),然后创建一个socket对象,调用connect()函数连接到服务器。(7)当客户端成功连接到服务器后,A、B各自“持有”一个能够发送和接收数据的socket对象。在这个例子中,客户端B先向服务器端A发送一个数据,然后等待服务器端A返回一个数据,收到A返回的数据后即断开网络连接。importsocketip_port=('',9999)sock=socket.socket() #创建套接字sock.connect(ip_port) #连接到服务器inp=input("请输入要发送的信息:").strip()sock.sendall(inp.encode()) #将数据发送给服务器reply=sock.recv(1024).decode()#等待接收服务器器发回的数据,1024代表接收缓冲区大小print(reply)sock.close()#关闭连接四、任务实现(8)在服务器端和客户端的代码都准备好之后,需要先运行ServerA.py程序,然后运行ClientB.py程序。然后在ClientB输入需要发送的信息如“hello”并按“Enter”键,此时可以看到ServerA程序运行的终端上显示“hello”,同时ClientB程序运行的终端上显示“bye”后结束。四、任务实现(9)上面代码完成的只是一个最基本的网络通信过程,只有一次信息交互。如果要实现聊天功能,可以在ServerA和ClientB的代码中各增加一个循环,在B向A发出一个信息后,A同时也给B回一个信息,即“一发一回”,重复执行这个过程,直到B发出的信息是“bye”时结束循环。importsocketip_port=('',9999)sock=socket.socket() #创建套接字sock.bind(ip_port) #绑定服务地址sock.listen(5) #开始监听连接请求print('启动socket服务,等待客户端连接...')conn,address=sock.accept() #等待连接,此处会自动阻塞whileTrue:#通过一个死循环不断接收客户端的数据,并回送信息
data=conn.recv(1024).decode() #接收客户端信息
print("来自%s的客户端向你发来信息:%s"%(address,data))ifdata=="bye":breakinp=input("请输入要发送给B的信息:").strip()conn.sendall(inp.encode()) #回送信息给客户端conn.close() #关闭连接ServerA代码四、任务实现(9)上面代码完成的只是一个最基本的网络通信过程,只有一次信息交互。如果要实现聊天功能,可以在ServerA和ClientB的代码中各增加一个循环,在B向A发出一个信息后,A同时也给B回一个信息,即“一发一回”,重复执行这个过程,直到B发出的信息是“bye”时结束循环。importsocketip_port=('',9999)sock=socket.socket() #创建套接字sock.connect(ip_port) #连接到服务器端whileTrue:#通过一个死循环不断发送数据给服务器端,并接收回送的信息
inp=input("请输入要发送给A的信息:").strip()sock.sendall(inp.encode()) #将数据发送给服务器端
ifinp=="bye":breakreply=sock.recv(1024).decode() #等待接收服务器端返回的数据
print(reply)sock.close() #关闭连接ClientB代码任务10.2遥控小画家一、任务描述分别编写客户端和服务器端程序,使用鼠标在客户端的窗体中模仿画笔进行绘图操作,服务器端则按照客户端相同的动作进行绘图。Socket编程通常可分为TCP和UDP两种,其中TCP是带连接的可靠传输服务,传输的数据会被校验,所以TCP是一种可靠的数据传输,这也是使用最广的通用模式之一。二、相关知识1.Socket详解UDP是一种无连接的非可靠数据传输方式,它的工作方式简单、粗暴,对发送出去数据不加控制和检查,因为少了一些步骤,所以传输速度相比TCP更快,但可能会造成部分数据丢失。拨打电话时,要对方确认才能通话信件寄出时对方不知道,可能会丢失二、相关知识2.Socket相关使用方法创建TCPSocket的代码sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)(1)
socket对象的创建创建UDPSocket的代码sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)二、相关知识(2)socket对象常用方法Socket网络通信程序运行时,必须服务端先启动,然后客户端才能正常连接,两者顺序不能颠倒。二、相关知识(2)socket对象常用方法三、任务分析这项任务要解决两个问题。1.启动一个客户端窗体,使用鼠标指针进行简单的绘图操作,类似于Windows画笔程序;2.将客户端鼠标指针移动时的坐标值,通过socket发送给服务器端,然后服务器端按照同样的坐标进行绘图,得到和客户端一样的轨迹线条,从而实现所谓的“遥控”功能。四、任务实现(1)新建Python文件,设置文件名为“PainterA.py”,导入turtle库,设置海龟的形状和颜色。接下来,调用ondrag()方法将鼠标(即鼠标指针)的“拖动事件”与绘图函数绑定,这样在拖动鼠标时就能够自动发出运行绘图函数的命令。importturtleast #导入海龟作图库t.shape(“turtle”) #设置海龟形状和画笔颜色t.color("blue")t.pendown() #设置落笔以便绘图defmove_turtle(x,y):t.goto(x,y)t.ondrag(move_turtle,1) #1表示鼠标左键t.mainloop()四、任务实现(2)为了让服务器端能够按照客户端的轨迹绘图,需将客户端窗体上的鼠标指针移动过程中产生的坐标值发送给服务器端(方便起见,这里给出完整代码)。importturtleast #导入海龟作图库importsocketip_port=('',8888)sock=socket.socket() #创建套接字sock.connect(ip_port) #连接到服务器t.shape("turtle") #设置海龟形状t.color("blue")t.pendown() #设置落笔以便绘图defmove_turtle(x,y):t.goto(x,y)xy=(x,y)sock.sendall(xy.__str__().encode())#将数据发送给服务器端
print(xy.__str__())t.ondrag(move_turtle,1) #1表示鼠标左键t.mainloop()四、任务实现(3)新建“PainterB.py”文件,监听8888端口接收客户端发送来的坐标值。网络代码要放在一个线程中,防止因阻塞导致绘图窗体的代码无法运行,从而不能显示绘图窗体。importturtleastimportsocketimportthreading#导入threading库defaction():ip_port=('',8888)sock=socket.socket()#创建套接字
sock.bind(ip_port)#绑定服务地址
sock.listen(5)#开始监听连接请求
print('启动socket服务,等待客户端连接...')conn,address=sock.accept()#等待连接,此处会自动阻塞
whileTrue:#通过一个死循环不断接收客户端的数据,并回送信息
data=conn.recv(1024).decode()#接收客户端数据
print("收到的绘图坐标:%s"%data)t.goto(100,100)#这里暂不处理坐标,直接将海龟移动至(100,100)位置#创建线程以接收来自客户端的绘图指令(即坐标值)四、任务实现(3)新建“PainterB.py”文件,监听8888端口接收客户端发送来的坐标值。网络代码要放在一个线程中,防止因阻塞导致绘图窗体的代码无法运行,从而不能显示绘图窗体。(4)现在客户端和服务器端的功能代码已经初步完成,可以尝试运行一下这两个程序。注意,应先启动服务器端PainterB程序,然后启动客户端PainterA程序,进行简单的绘图。#创建线程以接收来自客户端的绘图指令(即坐标值)thread=threading.Thread(target=action)thread.start()#显示绘图窗体t.shape("turtle")t.color("blue")t.pendown()t.mainloop()四、任务实现(5)修改客户端的程序(PainterA.py),将发送的坐标值格式修改为类似“10#20,”的形式。在服务器端(PainterB.py)中,按照客户端发送的数据格式将坐标值解析出来,然后用它去同步更新海龟图标的位置。defmove_turtle(x,y):t.goto(x,y)xy="{}#{},".format(x,y)sock.sendall(xy.encode())#将数据发送给服务器端
print(xy)①替换PainterA.py程序中的move_turtle()函数为下面的内容四、任务实现defaction():...whileTrue:#通过一个死循环不断接收客户端的数据,并回送信息
data=conn.recv(1024).decode()#接收客户端数据
print("收到的绘图坐标:%s"%data)xys=data.split(",") #将收到的坐标数据使用逗号分隔(可能是多组坐标值)forxyinxys:iflen(xy)==0: #忽略空字符串
continuem=xy.split("#") #将每一组坐标值用#号进行分隔
x=float(m[0]) #得到x坐标
y=float(m[1]) #得到y坐标
t.goto(x,y)②替换PainterB.py程序中的action()函数为下面的内容(主要修改了while循环的代码)四、任务实现(7)修正之后的服务端和客户端代码运行的效果如下。综合实训10班级聊天室编程任务项目背景:某班为方便交流,计划开发一个类似QQ群功能的聊天程序,以实现多人同时聊天的功能。考虑到不增加复杂性,所有数据交互直接在命令提示符窗口中进行。当在命令提示符窗口中输入文字信息发送给服务器时,服务器就把收到的信息转发至所有已连接到服务器上的客户端,从而达到多人群聊的目的。编程任务:根据背景描述,分别编写一个客户端和一个服务器端程序。需要注意的是,每个客户端输入的内容发送给服务器端后,服务器端在此充当中转的角
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拒绝恶性竞争承诺书(5篇)
- 河北省秦皇岛市抚宁县驻操营学区初中信息技术第一册 第十九课 调整图像色彩色调教学设计 新人教版
- 第十四课 具有视听效果的多媒体作品教学设计-2025-2026学年初中信息技术(信息科技)初中一年级(下册)教科版(云南)
- 2026年幼儿园六一活动
- 2026年幼儿园毛笔入门
- 福建省莆田市第八中学高二体育《羽毛球正手放网前球》教学设计
- 第3课 招聘电脑新“管家”教学设计-2025-2026学年小学信息技术(信息科技)6年级武汉版
- 劳动故事 一碗凉茶一段传承教学设计小学劳动三年级(2017)粤教版《劳动与技术》
- 第四节 液体的基本性质教学设计高中物理选择性必修第三册沪科版(2020·上海专用)
- 2026年幼儿园六的组成
- 《居家安宁疗护服务规范(征求意见稿)》编制说明
- 2026年采血点工作人员招聘试题及答案
- 浙江省省杭州市上城区建兰中学2026届中考数学四模试卷含解析
- 2026中国人民财产保险股份有限公司中宁支公司招聘8人农业笔试参考题库及答案解析
- 2026年注册安全工程师(初级)安全生产法律法规单套试卷
- 乌鲁木齐地区房屋建筑与市政工程施工图文件审查常见问题汇编2025版(勘察专业)
- 青海青江实业集团有限公司招聘笔试题库2026
- 2026对外经济贸易大学事业编专职辅导员、其他专技人员招聘备考题库答案详解
- 2026贵州黔晟投资有限公司第一批社会招聘8人备考题库附答案详解(完整版)
- 汉字六书课件
- 中国文字发展史课件
评论
0/150
提交评论