本文将会简单的运用socket和pygame模块来实现局域网内游戏,在同一个网络下,客户端输入正确的ip地址就能进行联机对战。
编译器:PyCharm 2021.2.1
解释器:Anaconda 3.8
安装模块
pip install pygame==2.1.0
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口 ——百度百科
简单点讲它能实现不同主机间的通信,例如我们每天浏览网页、QQ 聊天、收发 email
服务端
import socket
# socket.AF_INET 用于服务器之间的通信
# socket.SOCK_STREAM tcp通信
# 创建套接字
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ip 表示本机ip地址
# port 表示端口号
address = ('ip', 'port')
# 连接地址
server.bind(address)
# 监听数量
server.listen(5)
print('正在等待连接...')
# client 连接对象
# client_address 连接对象地址
client, client_address = server.accept()
# 发送数据
client.send('hahah'.encode('gbk'))
# 接受1024个字节数据
data = client.recv(1024)
print('服务器接受的数据', data.decode('gbk'))
# 关闭连接
client.close()
客户端
import socket
# 创建socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(('ip', 'port'))
# 发送的数据
client_socket.send('收到'.encode("gbk"))
# 接收对方发送过来的数据,最大接收1024个字节
recv = client_socket.recv(1024)
print('接收到的数据为:', recv.decode('gbk'))
# 关闭套接字
client_socket.close()
这里有人不知道本机的ip地址怎们查这里就教大家怎们查ip地址
首先win+r会弹出窗口,输入cmd点击确定
确定之后会弹出一个黑色的窗口,输入ipconfig,就出来了
网络游戏的本质其实就是收发数据,而怎样发送、接受、定义数据就是我们现在要考虑的了。下面主要讲解客户端的收发数据,服务器大同小异,也差不多,我们开始吧!
发送数据,当用户点击或者执行了某种行为,客户端就发送数据给服务器,服务器接收到数据,就会返回信息,以响应客户端。
def send_data():
global all_coordinate, sending
sending['checkerboard'] = all_coordinate
socket_client.send(json.dumps(sending).encode('gbk'))
sending['active'] = False
print('服务器发送的数据', sending)
接受数据,不管是客户端还是服务端,当客户端与服务器连接之后,就要时时刻刻接受数据。这里定义一个死循环来接受数据,当然肯定要开一个线程。
def accept_data():
global sending, all_coordinate
while True:
recv = socket_client.recv(4096)
sending = json.loads(recv.decode('gbk'))
all_coordinate = sending['checkerboard']
print('线程客户端接受的数据', sending)
这里用字典的形式来定义数据格式,当客户端发送数据,就会数据中的某一项进行改变,而服务器同样如此。
sending = {'checkerboard': all_coordinate,
'active': True,
'start': [False, False],
'time': False,
'flag': [False, 0, 0],
}
完整代码请点击这,欢迎大家的下,山高路远,江湖再见!!!