Russian Qt Forum
Октябрь 01, 2024, 00:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Странное поведение QTcpSocket. PyQt GPL v4.8.6 for Python v2.7 (x86), win7  (Прочитано 3764 раз)
andrewshkovskii
Гость
« : Декабрь 06, 2011, 13:09 »

Есть сокет. создается, коннектиться и соединяются слоты вот так :
Класс сокета:
Код
Python
# -*- coding: utf-8 -*-
from PyQt4.QtCore import QVariant, pyqtSignal
from PyQt4.QtNetwork import QTcpSocket
 
class UpQSocket(QTcpSocket):
data_ready = pyqtSignal(unicode)
def __init__(self):
QTcpSocket.__init__(self)
self.buffer = []
self.msg_buffer = []
self.wait_len = ''
self.readyRead.connect(self.on_ready_read)
self.setSocketOption(QTcpSocket.KeepAliveOption, QVariant(1))
 
def connectToHost(self, host, port):
QTcpSocket.connectToHost(self, host, port)
 
def send(self, data):
self.writeData('%s|%s' % (len(data), data))
 
def on_ready_read(self):
try:
data = str(self.readAll())
self.parse_data(data)
if self.buffer:
d = self.buffer.pop(0)
self.data_ready.emit(unicode(d))
if self.buffer:
self.on_ready_read()
return unicode(d)
except :
self.buffer=[]
self.msg_buffer=[]
self.wait_len = ''
 
def parse_data(self, data):
while data:
if not isinstance(self.wait_len, int):
# значит это начало сообщения
if not '|' in data:
# получили только кусочек длины
self.wait_len += data
break
else:
wait_len, data = data.split('|', 1)
self.wait_len = int(self.wait_len + wait_len)
tmp, data = data[:self.wait_len], data[self.wait_len:]
self.wait_len -= len(tmp)
self.msg_buffer.append(tmp)
if not self.wait_len:
msg = ''.join(self.msg_buffer)
self.msg_buffer = []
self.wait_len = ''
self.buffer.append(msg)
Код
Python
self.main_socket = UpQSocket()
self.main_socket.error.connect(self.socket_error)
 
self.main_socket.connectToHost('consultant.up.uiscom.ru',801)
self.main_socket.waitForConnected()
в слоте обработки ошибки:
Код
Python
self.main_socket.close()
if self.main_socket.state() != QAbstractSocket.UnconnectedState:
self.main_socket.waitForDisconnected(3000)
Вроде все правильно : ошибка - дисконнект.
Но через некоторое время опять ошибка возникает. Вот лог:
Цитировать
2011-12-06 12:34:10,859    CLIENT STARTED
try_to_connect_with_server
show_network_error
2011-12-06 12:34:12,926    NETWORK ERROR: Соединение было разорвано другим узлом (или по тайм-ауту).
2011-12-06 12:34:12,927    CLOSING MAIN SOCKET
retry count : 0
try_to_connect_with_server
2011-12-06 12:34:15,016    NETWORK ERROR: Соединение было разорвано другим узлом (или по тайм-ауту).
2011-12-06 12:34:15,016    CLOSING MAIN SOCKET
show_network_error
retry count : 1
--Здесь сокет закрыт, отсоеденен от сервера.
show_network_error
2011-12-06 12:34:44,003    NETWORK ERROR: Время для операции с сокетом истекло.
2011-12-06 12:34:44,003    CLOSING MAIN SOCKET
retry count : 0
try_to_connect_with_server
2011-12-06 12:34:46,072    NETWORK ERROR: Соединение было разорвано другим узлом (или по тайм-ауту).
2011-12-06 12:34:46,072    CLOSING MAIN SOCKET
show_network_error
retry count : 1
Как это так?я же закрыл сокет?Почему он продолжает сигналы ошибки испускать?
« Последнее редактирование: Декабрь 06, 2011, 13:11 от andrewshkovskii » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.178 секунд. Запросов: 21.