Есть сокет. создается, коннектиться и соединяются слоты вот так :
Класс сокета:
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
Как это так?я же закрыл сокет?Почему он продолжает сигналы ошибки испускать?