Python Socket не отправляет данные - PullRequest
0 голосов
/ 02 октября 2018

В настоящее время я работаю на сервере входа, который может возвращать данные пользователя на компьютер, который их запрашивает.Однако это не отправка каких-либо данных вообще.Вот части кода, которые, я думаю, могут вызывать ошибки:

Сервер

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 4876))
s.listen(1)
conn, addr = s.accept()

print('Connected: ' + addr[0])

data = conn.recv(1024)
print(addr[0] + ': ' + data)
data = data.split(' ')

if data[0] == 'rquser':
    print(addr[0] + ' requested user ' + data[1])
    users = open(read_settings()['local']['user_file'], 'r')
    users = json.load(users)
    user_found = (False, 0)
    print(addr[0] + ': searching... ')
    for x in range(len(users)):
        if users[str(x)]['username'] == data[1]:
            user_found = (True, x)
            break

    if user_found[0]:
        print(addr[0] + ': User found. ')
        conn.sendall(users[user_found[1]])
        conn.close()

Клиент

try:
    if read_settings()['local_users']:
        us = open(read_settings()['local']['user_file'], 'r')
        return json.load(us)
    else:
        if uid is None:
            raise ValueError
        else:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((read_network_settings()['server_ip'], 4876))
            message = 'rquser ' + uid
            s.sendall('rquser ' + uid)

            s_recv = ''
            data = s.recv(64)
            while True:
                data = s.recv(64)
                s_recv += data
                if not data:
                    break
            s.close()
            return s_recv
except IOError, socket.error:
    return None

Я заставил сервер распечатать статус, но, похоже, он остановился на Connected: 127.0.0.1 Я новичок в сокетах в python и у меня был небольшой успех с проектами.Но этот я не могу понять, почему он не работает

1 Ответ

0 голосов
/ 02 октября 2018

Вместо привязки вашего сервера к '127.0.0.1', используйте '' в качестве первого элемента кортежа, передаваемого на bind:

s.bind(('', 4876))

'' будет прослушивать любой IP, пытающийсяподключиться к локальной сети.

Кроме того, вы должны создать на сервере цикл while, который на каждой итерации пытается получить соединение, и, если соединение получено, что-то делать с клиентским объектом:

while True:
  try:
     conn, addr = s.accept()
  except:
     pass
  else:
     #do something with conn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...