Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 22, 2014 16:21:38

jct
Зарегистрирован: 2014-02-22
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет в потоке

Добрый день. Есть два скрипта:первый-сервер, второй- клиент.
Для проверки на отключение клиента сервер использует такой код

data = self.conn.recv(1024)
if not data:
    break
Когда я использую с сервером простой клиент все работает хорошо
s = socket.socket()
s.connect((host, port))
try:
    while True:
        buf = input(">>")
        s.send(bytes(buf.encode('utf-8')))
    #s.close()
finally:
    s.close()
Но если я выношу этот код в отдельный поток, серверная проверка детектит отключение
class client(threading.Thread):
    def __init__(self, sock):
        self.sock=sock
        threading.Thread.__init__(self)
    def run(self):
        try:
            while 1:
                data = self.sock.recv(1024)
                print (data.decode("utf-8"))
        finally:
            #sen.alive=False
            self.sock.close()
            return
s = socket.socket()
s.connect((host, port))
th=client(s)
th.start()
Мне думается, что это из-за того что когда происходит переключение на другой поток сокет приостанавливется, но пофиксить не могу

Отредактировано jct (Фев. 23, 2014 06:47:08)

Офлайн

#2 Фев. 22, 2014 22:54:07

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Сокет в потоке

Вы показали мне не тот код, в этом коде нет проблем, не считая мелочей:
1. s.close – зачем их два?
2. s.recv – откуда s?
3. sen.alive – чаво это?
4. return – ну если вам так нравится
5. первый сервер и последний клиент никогда не придут к согласию

Сами то его смотрели после постинга? Или ладно, интернет всё стерпит.
Если вы публикуете код для примера, то не поленитесь и проверить его в интерпретаторе, точно ли в нём воспроизводится ошибка и вы не добавили десяток других? Так же не помешает, хотя бы в скользь, упомянуть версию интерпретатора.

..bw



Отредактировано bw (Фев. 22, 2014 22:58:00)

Офлайн

#3 Фев. 23, 2014 06:45:03

jct
Зарегистрирован: 2014-02-22
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет в потоке

bw
1. s.close – зачем их два?
Да, случайно вышло
bw
2. s.recv – откуда s?
Да, ошибка
bw
3. sen.alive – чаво это?
Случайность
bw
4. return – ну если вам так нравится
?
bw
5. первый сервер и последний клиент никогда не придут к согласию
?
bw
Так же не помешает, хотя бы в скользь, упомянуть версию интерпретатора…bw
3.3
Пока не заработало, вот оба кода
Сервер http://pastebin.com/FNhyVKjr
Клиент http://pastebin.com/EpwiWZib

Офлайн

#4 Фев. 23, 2014 14:48:04

jct
Зарегистрирован: 2014-02-22
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Сокет в потоке

up

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version