您可以在非阻塞模式下使用套接字:
import pygame as pg
import socket
pg.init()
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", 55555)) # Connect to server
client.setblocking(False) # Prevent socket from waiting for input
W, H = 640, 480
FLAGS = 0
screen = pg.display.set_mode((W, H), FLAGS)
W, H = screen.get_size()
font = pg.font.SysFont("arial", 30)
text = ""
running = True
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
elif event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
running = False
try:
raw = client.recv(1024)
except BlockingIOError:
pass # No new data. Reuse old data
else:
text = raw.decode("utf-8") # New data has arrived. Use it
screen.fill((0, 0, 0))
img = font.render(text, True, (255, 255, 255))
r = img.get_rect(center=(W // 2, H // 2))
screen.blit(img, r)
pg.display.update()
这假设一个简单的服务器脚本是这样的:
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 55555))
server.listen()
while True:
client, address = server.accept()
print("Connected to", address)
while True:
line = input("> ")
try:
client.send(line.encode("utf-8"))
except ConnectionError as e:
print(e)
print("Disconnecting")
client.close()
break
它将在 pygame 窗口的中心显示您在服务器上输入的任何文本行。
如果您想要相反的情况,即服务器打开 pygame 窗口,您可以使用以下代码:
服务器:
import socket
import pygame as pg
pg.init()
W, H = 640, 480
FLAGS = 0
screen = pg.display.set_mode((W, H), FLAGS)
W, H = screen.get_size()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 55556))
server.listen(1)
server.setblocking(False)
client = None
font = pg.font.SysFont("arial", 30)
text = ""
clock = pg.time.Clock()
running = True
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
elif event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
running = False
elif event.type == pg.VIDEORESIZE:
screen = pg.display.set_mode(event.size, FLAGS)
W, H = screen.get_size()
# Logic
dt = clock.tick()
if client is None:
try:
client, address = server.accept()
except BlockingIOError:
pass
else:
try:
raw = client.recv(1024)
except BlockingIOError:
pass
else:
text = raw.decode("utf-8")
# Render
screen.fill((0, 0, 0))
img = font.render(text, True, (255, 255, 255))
r = img.get_rect(center=(W // 2, H // 2))
screen.blit(img, r)
pg.display.update()
pg.display.set_caption(f"FPS: {clock.get_fps():.2f}")
客户
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", 55556))
try:
while True:
line = input("> ")
try:
client.send(line.encode("utf-8"))
except ConnectionError as e:
print(e)
print("Disconnecting")
break
finally:
client.close()
如果您希望两者都有 pygames 窗口,我建议您考虑使用多个客户端和一个非 pygame 服务器。但无论如何,类似的代码应该可以工作。