Сегодня расскажу про соединение с сервером с помощью модуля Socket.
Что такое socket?
Сокеты или в переводе на русский разъёмы делятся на серверные и клиентские.
Серверные это как не трудно догадаться серверные разъёмы или адреса IP к которым подключаются клиентские.Когда вы скачиваете игру мультиплеер вы скачиваете клиентский файл в котором написана вся логика и все присущие ему файлы.А сервер отвечает обычно лишь за обмен даннами между клиентскими файлами.
Вот пример серверного файла:
import socket
import time
socket_g = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # настраиваем сокет
socket_g.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
socket_g.bind(('localhost', 10000)) # подключаем сокет пока что к нашему же хосту
socket_g.setblocking(0) # блокируем поочерёдную проверку
socket_g.listen(5) # задаём количество возможных подключений
p_s = [] # задаём список подключаемых игроков
while True:
try:
new_socket,addr=socket_g.accept() # задаём новый сокет при подключении
socket_g.setblocking(0) # также блокируем его
p_s.append(new_socket) # добавляем в список
time.sleep(1) # ждём одну секунду
except:
continue # если никто не подключается начинаем цикл заново
try:
for s in p_s: # считываем из списка 1024 килобайта
d = s.recv(1024)
j = d.decode() # декодируем их
except:
continue # если не получается также начинаем цикл заново
for s in p_s: # шлём всем игрокам в списке
try:
s.send("послание с сервера".encode()) # повслание
except:
p_s.remove(s) # если не вышло проходимся ещё раз
s.close() # закрываем сокет
time.sleep(1) # ждём секунду
Примерно такой файл обычно размещают на VDS серверах для круглосуточной работы.Данный код пошлёт вам послание с сервера при подключении и примет ваше.
А вот файл клиента который считывает данные в зависимости от нажатых клавиш и шлёт их на сервер:
import socket
import pygame
pygame.init()
step = 10
r = step
screen = pygame.display.set_mode((640, 480)) # данное окно пайгейм нужно лишь чтобы сделать проверку клавиш
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # всё как на сервере
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
s.connect(('localhost',10000)) # подключаемся к домашнему хосту
x = 0
y = 0
while True:
for event in pygame.event.get(): # проверка событий
if event.type == pygame.KEYDOWN: # если нажата клавиша
if event.key == pygame.K_LEFT: # если нажата влево
x = -r
elif event.key == pygame.K_RIGHT: # если нажата вправо
x = r
elif event.key == pygame.K_UP: # если нажата вверх
y = -r
elif event.key == pygame.K_DOWN: # если нажата вниз
y = r
j = s.recv(1024)# как и на сервере
d = j.decode() # декодируем присланное с сервера сообщение
s.send(str(x).encode()) # кодируем координаты по икс
s.send(str(y).encode()) # и по игрик
print(d)
Данный пример является одним из многочисленных примеров передачи и принятия данных в данном случае игрока.
Пишите как вам в комментариях.
код клиента:
https://github.com/Yakov-kaktus/-/blob/main/player.py
код сервера:
https://github.com/Yakov-kaktus/-/blob/main/server.py