之前我们系统地描述了五子棋的人机对战了解了五子棋的基本操作例如电脑的应手算法输赢判断等等。那如何实现五子棋的网络对战即人人对战呢这里就用到了套接字socket编程听上去很高级其实无论哪种编程语言实现起来的方法套路都是大同小异的。一、python的套接字socket编程基本概念及操作对基本原理的理解是学习编程的基础。1.1服务端就是一系列硬件或软件为一个或多个客户端服务端服务的用户提供所需的“服务”。它存在唯一目的就是等待客户端的请求经常称之为“监听”并响应客户端为客户端提供服务然后等待更多请求周而复始。1.2套接字是计算机网络数据结构在任何类型的通信开始之前网络应用程序必须创建套接字。socket原意就是插座插口插孔的意思所以可以将它们比作网络插孔没有它将无法进行通信。Python只支持AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET 尤其是使用基于网络的AF_INET.套接字三要素IP端口协议。python使用元组保存:ADDR (IP,端口)。协议流式套接字(SOCK_STREAM):用于提供面向连接、可靠的数据传输服务。TCP数据报套接字(SOCK_DGRAM):提供了一种无连接的服务。这个并不能保证数据传输的可靠性数据有可能在传输过程中丢失或出现数据重复且无法保证顺序地接收到数据。UDP1.3python常用对象方法和属性服务器套接字方法bind(ADDR) 将地址(主机名、端口号对)绑定到自接字上listen([backlog]) 设置并启动TCP监听器如果指定backlog则必须至少为0(如果低于0则设置为0);accept() 被动接受TCP客户端连接一直等待直到连接到达(阻塞)客户端套接字方法connect() 主动发起 TCP服务器连接connect_ex() connect()的扩展版本此时会以猎误码的形式返回问题而不是抛出一个异常通用套接字方法recv() 接收 TCP消息recv_into() 接收TCP 消息到指定的缓冲区send() 发送TCP消息sendall() 完整地发送 TCP消息recvfrom() 接收 UDP消息recvfrom_into() 接收 UDP 消息到指定的缓冲区sendto() 发送 UDP消息getpeername() 连接到套接字(TCP)的远程地址getsockname() 当前套接字的地址getsockopt() 返回给定套接字选项的值setsockopt() 设置给定套接字选项的值shutdown() 关闭连接close() 关闭套接字detach() 在未关闭文件描述符的情况下关闭套接字返回文件描述符ioctI() 控制套接字的模式(仅支持Windows)面向阻塞的套接字方法setblocking() 设置套接字的阻塞或非阻塞模式settimeout() 设置阻塞套接字操作的超时时间gettimeout() 获取阻塞套接字操作的超时时间面向文件的套接字方法fileno() 套接字的文件描述符makefile() 创建与套接字关联的文件对象数据属性family 套接字家族AF_UNIX、AF_NETLINK、AF_TIPC 、AF_INETtype 套接字类型 SOCK_STREAM、SOCK_DGRAMproto 套接字协议1.4通常TCP的服务端和客户端创建的步骤如下服务端serverTCP socket() # 创建服务器套接字 serverTCP.bind(HOST,PORT) # 套接字与地址端口绑定 serverTCP.listen() # 监听连接 while True: # 服务器无限循环 clientTCP serverTCP.accept() # 接受客户端连接 comm_loop: # 通信循环 clientTCP.recv()/clientTCP.send() # 对话接收 / 发送 clientTCP.close() # 关闭客户端套接字 serverTCP.close() # 关闭服务器套接字 # 可选客户端clientTCP socket() # 创建客户端套接字 clientTCP.connect(HOST,PORT)# 尝试连接服务器 comm_loop: # 通信循环 clientTCP.send()/clientTCP.recv() # 对话发送 / 接收 clientTCP.close() # 关闭客户端套接字注UDP这里不详细讲解。可以参考下面的示例代码二、下面就是详细的python代码。先执行 server.py,然后执行client.py,就可以看到TPC/UDP简单的通信效果了。server.pyimport socket from time import ctime import json import time HOST PORT 9001 ADDR (HOST, PORT) BUFFSIZE 1024 MAX_LISTEN 5 def tcpServer(): # TCP服务 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # 绑定服务器地址和端口 s.bind(ADDR) # 启动服务监听 s.listen(MAX_LISTEN) print(等待用户接入......) while True: # 等待客户端连接请求,获取connSock conn, addr s.accept() print(远端客户:{} 接入系统.format(addr)) with conn: while True: print(接收请求信息......) # 接收请求信息 data conn.recv(BUFFSIZE) print(data%s % data) print(接收数据{%r}.format(data.decode(utf-8))) # 发送请求数据 conn.send(data.encode(utf-8)) print(发送返回完毕) s.close() # 创建UDP服务 def udpServer(): # 创建UPD服务端套接字 with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: # 绑定地址和端口 s.bind(ADDR) # 等待接收信息 while True: print(UDP服务启动准备接收数据...) # 接收数据和客户端请求地址 data, address s.recvfrom(BUFFSIZE) if not data: break print(接收请求信息{}.format(data.decode(utf-8))) s.sendto(bThis is a udp server!, address) s.close() if __name__ __main__: while True: choice input(请选择 t-tcp 或 u-udp:) if choice ! t and choice ! u: print(请输入 t 或 u,不接受其他字符) continue if choice t: print(TCP服务端) tcpServer() else: print(UDP服务端) udpServer()client.pyimport socket from time import ctime HOST localhost PORT 9001 ADDR (HOST, PORT) ENCODING utf-8 BUFFSIZE 1024 def tcpClient(): # 创建客户套接字 with socket.socket(familysocket.AF_INET, typesocket.SOCK_STREAM) as s: # 尝试连接服务器 s.connect(ADDR) print(连接服务成功) # 通信循环 while True: inData input(请输入内容q退出:) if inData q: break # 发送数据到服务器 inData [{}]:{}.format(ctime(), inData) s.send(inData.encode(ENCODING)) print(发送成功) # 接收返回数据 outData s.recv(BUFFSIZE) print(返回数据信息{!r}.format(outData)) # 关闭客户端套接字 s.close() def udpClient(): # 创建客户端套接字 with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: while True: # 发送信息到服务器 data input(请输入内容quit退出:) if data quit: break data [{}]:{}.format(ctime(), data) s.sendto(data.encode(utf-8), ADDR) print(send success) # 接收服务端返回信息 recvData, addrs s.recvfrom(BUFFSIZE) print(接收到的信息 : {}.format(recvData.decode(utf-8))) # 关闭套接字 s.close() if __name__ __main__: while True: choice input(请选择 t-tcp 或 u-udp 或 q-quit:) if choice q: break if choice ! t and choice ! u: print(请输入 t 或 u,不接受其他字符!) continue if choice t: print(TCP服务端) tcpClient() else: print(UDP服务端) udpClient()把这两个代码复制执行一下看看效果。待续.....pythonpygame实现五子棋网络对战之二
企业数字化 ERP 产品动态
相关推荐
Cocotb PCIe仿真:Python驱动Verilog验证实战 简介:这份资源是面向数字IC验证工程师与PCIe协议学习者的Cocotb仿真框架,聚焦用Python驱动Verilog硬件模型完成PCI Express验证。包内共55个文件,以38个Python脚本为核心,承担测试序列生成、协议层校验与结果分析;5个V… · 2026/9/23 10:34:19
DCGAN实战:低对比度红外图像增强的原理、训练与避坑指南 简介:一套面向图像处理与深度学习开发者的低对比度红外图像增强项目源码,基于深度卷积生成对抗网络实现。针对红外图像对比度低、细节模糊的成像痛点,通过生成器与判别器的对抗训练,自动学习图像特征并生成更清晰的增强结果&#… · 2026/9/23 10:34:19
Cocotb PCIe仿真框架:Python驱动Verilog事务层实战 简介:这份资源是面向数字IC验证工程师与FPGA/ASIC学习者的Cocotb PCI Express仿真框架,重点解决如何用Python驱动Verilog硬件模型完成PCIe协议验证的问题。包内共55个文件,以38个Python脚本为主体,承担测试序列生成、事务构造、协… · 2026/9/23 10:34:19
自然月、自然周、自然日:统计口径的底层逻辑与实战避坑指南 1. 时间维度里的“自然”到底指什么刚入行做数据统计那会儿,我对“自然月”这个词一直没太在意,觉得不就是每个月1号到月底嘛,能有什么讲究。直到有一次做用户活跃度报表,业务方看完之后问我:“为什么2月份的数据比1月… · 2026/9/23 11:13:58
华为hisuite实战避坑:3个完整示例帮你搞定驱动难题 华为hisuite实战避坑:3个完整示例帮你搞定驱动难题 复制来的代码跑不通不知道怎么调?别急着甩锅给编译器。很多时候,问题不在语法,而在环境依赖和底层接口调用的微妙差异。尤其是在处理华为手机设备时,HiSuite作为官方配套工具,其接口行… · 2026/9/23 11:13:52
Python+CNN网络入侵检测:从PCAP到实时告警的完整实践 简介:本资源是一套基于Python与卷积神经网络(CNN)实现的网络入侵检测系统源码,面向网络安全方向的初学者、高校学生及AI安全实践者,解决传统规则引擎在未知攻击识别上的局限性,提供可复现的深度学习落地方案… · 2026/9/23 11:13:52
RGB图像预测叶绿素含量:农业AI轻量化落地实践 简介:本资源是一套基于Python机器学习实现图像数据预测植物叶绿素含量的完整毕业设计项目,面向软件工程、人工智能、电子信息等专业的本科生与研究生,解决农业遥感、作物生理参数无损检测中的建模与部署实际问题。压缩包共9个文件(… · 2026/9/23 11:13:45
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29