Странная проблема с сокетом в Python 3.2 - PullRequest
0 голосов
/ 20 августа 2011

Я сейчас создаю чат-приложение на python. Это работает так: 1. Сервер работает 2. Клиенты вводят свой идентификатор и пароль 3. Информация для входа проверяется сервером 4. Им назначается случайное число сервером 5. Теперь они могут отправлять и получать сообщения с и на сервер

У меня проблема с получением ID и пропуска (пожалуйста, не вините меня за использование global и exec)

def recv_server():
    global number
    global s     #the tcp socket
    exec("global sock"+number) #creating a specific sock for each connection
    exec("sock"+number+","+"sockname"+number+" = s.accept()")
    exec("logindata=sock"+number+".recv(65535)")
    logindata=logindata.decode()
    ...

Номер 1, код будет:

global sock1
sock1, sockname1 = s.accept()
logindata=sock1.recv(65535)

Я использую python 3.2 в Windows и при запуске сценария, когда данные для входа в систему обычно имеют значение, теперь они не назначены

File 'abc' line 23, in recv_server
logindata=logindata.decode()
UnboundLocalError: local variable 'logindata' referenced before assigment

На моем компьютере с Linux (mint 11) обмен файлами с помощью dropbox и открытие с помощью python (2.7) не дает мне никакой ошибки

Теперь я спрашиваю, знает ли кто-нибудь, что является причиной этой проблемы?

Ответы [ 2 ]

2 голосов
/ 20 августа 2011

Ой ой ой.

Что касается материала global, я позволю вам исправить это, но

def recv_server():
    global number
    global s     #the tcp socket
    global sockets
    sockets[number], sockname = s.accept()
    logindata = sockets[number].recv(65535)
    logindata = logindata.decode()
    ...

с определением sockets возможно sockets = {} илитак будет хотя бы попыткой разумно кодировать.

Тогда exec исчезнет, ​​и останется только global, что ИМХО не хорошо, но не так страшно, как другие.

Ваша ошибка происходит из-за того, что компилятор не распознал первое присвоение logindata из-за exec.

1 голос
/ 20 августа 2011

Попробуйте вообще не использовать exec.

def recv_server():
    globals()["sock"+number], locals()["sockname"+number] = s.accept()
    logindata = locals()["sock"+number].recv(65535)
    logindata=logindata.decode()

Я думаю, что есть большое недопонимание глобальных и местных жителей на работе Вот. Прежде всего, если number и s не назначены в локальной (функциональной) области видимости, тогда нет необходимости объявлять их как global с, поскольку они будут только прочитаны. Во-вторых, зачем вообще так? должен быть sockname # в локальной области видимости. Это может быть просто sockname

Возможно, вы пришли из языка без той же области видимости, что и Python? Если это так, ваша жизнь была бы намного проще, если бы вы нашли время, чтобы ознакомиться с разницей между локальной и глобальной областью действия в Python.

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