Go back
Sending Objects
Subscribe to Tech with Tim
YouTube
Sending Objects
In this python online game tutorial I will be showing how we can send objects over our network. In the last video we sent string data containing the position of each of our clients. This worked... but it is not very scale-able. Being able to send actual objects is a much better and more scale-bale solution and is what we will be doing here.
client.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()
network.py
import socket import pickle class Network: def __init__(self): self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server = "10.11.250.207" 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)
server.py
import socket from _thread import * from player import Player import pickle server = "10.11.250.207" 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