Сокет не определен, когда я его создал - PullRequest
1 голос
/ 11 апреля 2020

У меня есть программа, которая просто отправляет сообщения на сервер через интерфейс tkinter. Я использую различные подпрограммы для запуска таких базовых вещей, как запуск нового соединения и отправка сообщения. Единственная проблема заключается в том, что он продолжает выдавать ошибку с именем «ClientOcket не определен», когда пользователь имеет до go через другую подпрограмму для установления sh соединения.

Я попытался переместить подпрограммы, делая clientocket глобальной переменной, и я дважды проверил правильность моих имен. Код, который я получил из этих подпрограмм, отлично работает (программа для чата, которая запускается в консоли, которую я сделал некоторое время go), так что, должно быть, именно так я структурировал программу.

Вот все подпрограммы которые имеют дело с сокетами

def send_msg(): # Sends a message to the server (called from tkinter button)
        try:
            Csend = field.get("1.0", "end-1c")
            Csend = str(Csend)
            clientsocket.send(Csend.encode())

            field.delete()
            field.insert(END, "")
        except error as err:
            Csend = field.get("1.0", "end-1c") # 1.0 - Line one, char zero
            print(f"Can't send message \"{Csend}\": Not connected to a server")
            print(err)

    def new_connection():
        # Tkinter code goes here
        def connect_server(): # Tries to connect to the server
            try: # This runs the first check, if there is an existing connection
                clientsocket.close()
            except:
                print("No existing connection")

            try: # Runs the second check, if it can connect using the info
                clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

                host = host_ent.get() # Gets STR of host IP
                port = port_ent.get() # Gets STR of port
                port = int(port) # Converts port to INT

                clientsocket.connect((host, port)) # Connects to the server
            except:
                print("Could not connect, incorrect inputs?")

    def disconnect_server():
        try:
            clientsocket.close()
        except:
            print("No existing connection")

Все эти подпрограммы вызываются из меню или кнопок tkinter.

Я совершенно новичок в сокетах, поэтому, если какой-либо код является уровнем новичка, то я извините.

Заранее благодарен за любую помощь!

1 Ответ

1 голос
/ 11 апреля 2020

Проблема в том, что вы не определяете сокет как глобальный, а только локальный в вашей функции. Вы должны добавить global clientsocket под заголовком каждой функции, которую вы используете в своей clientocket.

...