Как можно использовать сокет Python (UDP) для подключения разных машин на разных WiFi? - PullRequest
0 голосов
/ 16 мая 2018

Я пытался настроить игру, чтобы играть с моими друзьями.Мы все живем в разных местах и ​​у нас разные IP, WiFi и т. Д. Я начал кодировать на своем компьютере, используя socket, используя SOCK_DGRAM.Это работало нормально, когда я запускал код сервера и клиента на своем компьютере, но когда мои друзья пытались запустить код клиента, они не могли ничего отправить на мой сервер.Не было выдано никакой ошибки, то, что они отправили, просто не было получено моим сервером.

Вот код сервера:

    import socket

    host = "192.168.88.191"
    port = 2000
    connections = Connections() # Where I store my friends' way of contacting the server
    player_list = [] # A list of players to be used by my Players class

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host, port))
    s.setblocking(False)

    print("Server started")
    while True:
        try:
            data, addr = s.recvfrom(1024)
            got_data = True
        except OSError:
            got_data = False

        if got_data:
            if not addr in connections.addresses:
                connections.addresses.append(addr) # Store all new addresses
                player_list.append(Players(len(player_list))) # Append to player list (don't worry about this part)

            data = data.decode("utf-8")

            print("Message from " + str(addr) + ": " + data)
            player_list[int(addr[1] - 2001)].move(data, player_list) # Function for game logic

            message = ""
            for player in player_list:
                message += str(player.number) + " " + str(player.x) + " " + str(player.y) + "," # Make the message that I want to send
            message = message[:-1]
            print("Sending: " + message)
            for address in connections.addresses:
                s.sendto(message.encode("utf-8"), address)

Вот код клиента:

class Sock():
    def __init__(self):
        self.host = "192.168.88.191"
        self.port = 2000

        self.server = (self.host, 2000)
        self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        while True:
            try:
                print("Trying to connect on port " + str(self.port))
                self.s.bind((self.host, self.port))
            except OSError:
                self.port += 1
            else:
                self.s.setblocking(False)
                print("Connected on port " + str(self.port) + "!")
                break

    def send_data(self, message):
        print("Sending: " + message)
        self.s.sendto(message.encode("utf-8"), self.server)

    def recieve_data(self):
        try:
            data, addr = self.s.recvfrom(1024)
            data = data.decode("utf-8")
            print("Recieved from server: " + data)
            return data
        except socket.error:
            pass

Мой IP-адрес 192.168.88.191.Я бы предположил, что мои друзья должны использовать свой IP в коде клиента, но где?Я знаю, что вы можете найти свой IP, выполнив socket.gethostbyname(socket.gethostname())

РЕДАКТИРОВАТЬ: этот код клиента на самом деле не работал, он пытался каждый порт, пока не достиг максимально возможного порта и выдал ошибку.Мы внесли некоторые изменения в код и подключили его, но сервер все равно ничего не получил.Клиент мог отправить просто отлично, но сервер не получил.Я не на 100% рассматриваю корректировку, но я думаю, что мы заменили: self.server = (self.host, 2000) на: self.server = (socket.gethostbyname(socket.gethostname()), 2000), хотя, как я уже сказал, я не знаю точно ли это, что мы сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...