Python网络通信程序典型应用
1. 创建资源
开始实验之前,您需要先创建实验相关资源。
- 在实验室页面,单击创建资源。
- (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、用户信息等)。
说明:资源创建过程需要3~5分钟。完成实验资源的创建后,您可以在 云产品资源 列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。
实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息
2. 连接ECS服务器
- 在本地电脑上找到远程桌面连接,点击打开远程桌面连接。
- 在远程桌面连接端输入服务器IP地址、用户名administer。
说明:您可以切换到页面左上方「云产品资源」列表查看资源详情信息。
- 在弹出的对话框中输入服务器密码,点击确定。并在证书选项选择是。
4. 成功连接后进入服务器页面。
3. 编写Python网络通信程序
- 双击运行桌面的PyCharm软件。
- 打开后,选择Creat New Project创建新的工程。
- 点击create,等待创建过程的完成。
- 创建完成后,右键选择New — Python File创建新的Python文件。
- 在输入框中输入要新建的python文件的名字。回车确认后,即可看到创建好的python文件,这里我们创建两个文件,一个是client.py(客户端)另外一个是server.py(服务端)。
- 我们先来编写client客户端的代码,创建一个socket对象,指定要连接的目标服务器ip及端口号,并向服务器端发送和接收数据。
import socket #创建一个socket对象,指定要连接的目标服务器 ip及端口号 # 第一步 s = socket.socket() # 第二步 s.connect(('127.0.0.1',9999)) while True: recv_data = str(s.recv(20480), encoding='utf8') #客户端接收来自服务器端发送的数据 print(recv_data) #连接成功后向服务器端发送数据 send_data = input('') s.sendall(bytes(send_data,encoding = 'utf8')) if send_data=='bye': break s.close()
- 接下来进行server服务端的代码编写。
import socketserver import random all_choices = ['石头', '剪刀', '布'] win_list = [['剪刀', '布'], ['布', '石头'], ['石头', '剪刀']] #创建一个socketserver类继承socketserver模块下的BaseRequestHandler类 class MyServer(socketserver.BaseRequestHandler): def handle(self, cwin=0,pwin=0):# 服务器端阻塞,等待客户端连接 #重写父类中的handle方法,主要实现服务端的逻辑代码,,不用写bind() listen() accept() while True: conn = self.request addr = self.client_address print(conn) #<socket.socket fd=864, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 50565)> print(addr) #('127.0.0.1', 50565) while True: computer = random.choice(all_choices) send_data=('请出拳:(0) 石头(1) 剪刀(2) 布') send_data=send_data.encode() conn.sendall(send_data) recv_data = str(conn.recv(20480), encoding='utf8') #接收到来自客户端的数据 print(recv_data) if recv_data == 'bye': #如果客户端发送的是‘bye’就断开连接 break index = int(recv_data) player = all_choices[index] send_data = ('你出了:%s,计算机出了:%s' % (player, computer)) send_data = send_data.encode() conn.sendall(send_data) if player == computer: send_data = ('\033[32;1m平局\033[0m') send_data = send_data.encode() # 类型转换 conn.sendall(send_data) # 服务器端回复数据给客户端 elif [player, computer] in win_list: send_data = ('\033[32;1m你赢了!\033[0m') send_data = send_data.encode() conn.sendall(send_data) pwin += 1 else: send_data=('\033[31;1m你输了!\033[0m') send_data = send_data.encode() conn.sendall(send_data) cwin += 1 conn.close() if __name__ == '__main__': #实例化server对象,传入本机ip,以及监听的端口号,还有新建的继承socketserver模块下的BaseRequestHandler类 server = socketserver.ThreadingTCPServer(('127.0.0.1',9999),MyServer) #激活服务端 server.serve_forever()
- 运行客户端和服务端代码,验证效果。选择要运行的Python文件右键---选择Run(注意:这里要先运行server服务端)。
Server服务端运行后效果如下:
Client客户端运行后效果如下:
- 运行后验证程序,在client客户端下输入剪刀石头布所代表的数字,可以看到效果。
同时也可以看到server服务端所返回的效果。
以上便完成了Python网络通信程序的编写。
实验链接:https://developer.aliyun.com/adc/scenario/188ac41b15184cec87ce74105f4c18dc