Форум сайта python.su
У меня несколько скриптов, каждый из них открывает соединение с одним и тем же сервером на разных портах
1 запущенный скрипт работает нормально
2 нормально
3 идет разрыв соединение и при попытке переподключится выдает эррор
при пререподключении я закрываю старое соединение(на всякий случай) и пытаюсь открыть новое на что получаю :
Exception in thread Thread-4:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "my_pretty.py", line 570, in run
sock.send(size)
File "/usr/lib/python2.7/socket.py", line 170, in _dummy
raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor
Отредактировано (Март 14, 2012 16:39:42)
Офлайн
Как правильно организовывать реконект по сокету ?
# -*- coding: utf-8 -*-
import socket
import time
HOST = '10.10.20.10'
PORT = 1111
print "Установка соединения с сервером", HOST+':', PORT
try :
sock.connect((HOST, PORT))
except Exception, e:
print 'Соединение не установлено, причина:', e
sys.exit(0)
print 'Соединение установлено'
# запуск потоков обмена информацией
...
...
# когда происходит разрыв, в result попадает пустота ... result = '' и со временем получаю ошибку broken pipe
result = sock.recv(1024)
# пытаюсь реконектутся
if result = '':
sock.close()
time.sleep(1) # ну что б наверняка
try :
sock.connect((HOST, PORT))
except Exception, e:
print 'Соединение не установлено, причина:', e
sys.exit(0)
print 'Соединение установлено'
# и тут же [Errno 9] Bad file descriptor
Отредактировано (Март 15, 2012 12:17:13)
Офлайн
Я могу ошибаться, но сам реализовывал иначе. Необходимо
result = sock.recv(1024)
def ConnectionsListener(self, conn_info): print '%s -- Called ConnectionsListener(%s, %s, %s)'%(time.time(), conn_info.sock, conn_info.addr, conn_info.OwnerName) while True: try: self.SendStrToClient('>', conn_info.sock) packet = conn_info.sock.recv(1024) for _tmp_counter in range(len(self.ListOfConnInfo)): if conn_info.sock == self.ListOfConnInfo[_tmp_counter].sock: conn_info.OwnerName = self.ListOfConnInfo[_tmp_counter].OwnerName break self.CommandDispatcher(packet, conn_info) except: print '%s -- Oops, %s closed by peer, killing it'%(time.time(), conn_info.sock) conn_info.sock.close() tmp_counter = 0 for tmp_counter in range(len(self.ListOfConnInfo)): if conn_info.sock == self.ListOfConnInfo[tmp_counter].sock: del self.ListOfConnInfo[tmp_counter] break tmp_counter += 1 break
Отредактировано AlexeyB (Март 27, 2012 12:44:40)
Офлайн
В сообщество Python вступил недавно так что…
В общем задача: написание простенького демона для серверной части игры. К серверу подключился через сокет, а вот передача данных ни в какую:
“import socket, string, sys
HOST=”localhost“
PORT=20000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((HOST, PORT))
s.send(”mission BEGIN“)
Traceback (most recent call last):
File ”C:\Python32\connect.py“, line 10, in <module>
s.send(”mission BEGIN“)
TypeError: ‘str’ does not support the buffer interface
>>> ”
Просьба пихнуть в нужную сторону, я дальше сам разберусь. Заранее спасибо. Кстати через send() не отправляются ни строковые ни числовые данные.
Офлайн
Через socket.send отправляются байты
Офлайн
Это я понял. Мне интересно, как оправить через сокет строковое значение.
Офлайн
Даже если слово “сериализация” вам незнакомо, ответ находится мгновенно. Вариациями на тему - Google: “send string over socket python”.
Офлайн
Спс, будем копать
Офлайн