python - Pygame 和套接字在线
问题描述
您好,我从 tim online 的技术中了解了 pygame 在线多人游戏,我在他的第 5 课。这是这个的代码:Server.py
from _thread import *
from player import Player
import pickle
server = "192.168.1.5"
port = 5555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.bind((server, port))
except socket.error as e:
str(e)
s.listen(2)
print("Waiting for a connection, Server Started")
players = [Player(0,0,50,50,(255,0,0)), Player(100,100, 50,50, (0,0,255))]
def threaded_client(conn, player):
conn.send(pickle.dumps(players[player]))
reply = ""
while True:
try:
data = pickle.loads(conn.recv(2048))
players[player] = data
if not data:
print("Disconnected")
break
else:
if player == 1:
reply = players[0]
else:
reply = players[1]
print("Received: ", data)
print("Sending : ", reply)
conn.sendall(pickle.dumps(reply))
except:
break
print("Lost connection")
conn.close()
currentPlayer = 0
while True:
conn, addr = s.accept()
print("Connected to:", addr)
start_new_thread(threaded_client, (conn, currentPlayer))
currentPlayer += 1
客户端.py:
import pygame
from network import Network
from player import Player
width = 500
height = 500
win = pygame.display.set_mode((width, height))
pygame.display.set_caption("Client")
def redrawWindow(win,player, player2):
win.fill((255,255,255))
player.draw(win)
player2.draw(win)
pygame.display.update()
def main():
run = True
n = Network()
p = n.getP()
clock = pygame.time.Clock()
while run:
clock.tick(60)
p2 = n.send(p)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
p.move()
redrawWindow(win, p, p2)
main()
网络.py:
import socket
import pickle
class Network:
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server = "192.168.1.5"
self.port = 5555
self.addr = (self.server, self.port)
self.p = self.connect()
def getP(self):
return self.p
def connect(self):
try:
self.client.connect(self.addr)
return pickle.loads(self.client.recv(2048))
except:
pass
def send(self, data):
try:
self.client.send(pickle.dumps(data))
return pickle.loads(self.client.recv(2048))
except socket.error as e:
print(e)
和 player.py:
import pygame
class Player():
def __init__(self, x, y, width, height, color):
self.x = x
self.y = y
self.width = width
self.height = height
self.color = color
self.rect = (x,y,width,height)
self.vel = 3
def draw(self, win):
pygame.draw.rect(win, self.color, self.rect)
def move(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
self.x -= self.vel
if keys[pygame.K_RIGHT]:
self.x += self.vel
if keys[pygame.K_UP]:
self.y -= self.vel
if keys[pygame.K_DOWN]:
self.y += self.vel
self.update()
def update(self):
self.rect = (self.x, self.y, self.width, self.height)
好的,这就是代码。当我运行它时,我没有问题,但我只能运行 2 个客户端,如果有人关闭其中一个客户端,那么我将无法再次运行它。有什么解决办法吗?对不起,如果我的英语不好,因为我不太了解它。谢谢!
解决方案
推荐阅读
- css - 解释这个 CSS 自定义属性行为
- google-cloud-platform - 大查询数据传输 - 如何避免文件限制?
- c++ - RSA_PKCS1 签名验证
- javascript - HTML5 音频 - 播放器仅加载和播放列表中的第一个文件
- html - 如何将内容与html页面的中心对齐
- php - Json编码时如何防止数组位置转换为字符串并强制输出为int
- java - 将 Android Studio 升级到 4.0 后,我得到“原因:java.lang.IllegalStateException:意外的非类文件”
- python - python在行中查找数字字符串
- java - Guice Assisted:没有使用 @com.google.inject.assistedinject.Assisted(value=prefix) 注释的 java.lang.String 的实现被绑定
- python - 如何防止 Cartopy 自动旋转刻度标签?