2013-04-01 2 views
0

По какой-то причине self.connected класса asyncore.dispatcher не считает мой сокет подключенным на стороне клиента. Сторона сервера видит сокет как подключенный и рассматривает его как таковой, но клиент не знает, подключен он или нет, а handle_connect не «proc», поэтому я не могу использовать его переопределенную версию, чтобы проверить, разъем также подключен.Python - гнездо Asyncore (клиент) - не удается определить состояние соединения

Любые мысли по этому коду, почему он не работает:

#!/usr/bin/python 
# -*- coding: iso-8859-15 -*- 
import asyncore 
from threading import * 
from socket import * 
from time import sleep 
from os import _exit 
from logger import * 
from config import * 

class logDispatcher(asyncore.dispatcher): 
    def __init__(self, config=None): 
     self.inbuffer = '' 
     self.buffer = '' 
     self.lockedbuffer = False 
     self.is_writable = False 

     asyncore.dispatcher.__init__(self) 
     #Thread.__init__(self) 

     self.create_socket(AF_INET, SOCK_STREAM) 

     #self.is_writable = True 
     #self.start() 

    def compare(self, obj, otherobj): 
     return (str(obj).lower() == str(otherobj).lower()[:len(str(obj))]) 
    def _in(self, obj, otherobj): 
     return (str(obj).lower() in str(otherobj).lower()) 

    def parse(self): 
     if self.inbuffer[-2:] != '\r\n': 
      return False 

     self.lockedbuffer = True 
     self.inbuffer = '' 
     self.lockedbuffer = False 

    def readable(self): 
     return True 

    def handle_connect(self): 
     log('Connected to ' + str(server), 'SOCK_CORE') 

    def handle_close(self): 
     self.close() 

    def handle_read(self): 
     data = self.recv(8192) 
     while self.lockedbuffer: 
      sleep(0.01) 
     self.inbuffer += data 

    def writable(self): 
     return (len(self.buffer) > 0) 

    def handle_write(self): 
     while self.is_writable: 
      sent = self.send(self.buffer) 
      sleep(1) 
      self.buffer = self.buffer[sent:] 
      if len(self.buffer) <= 0: 
       self.is_writable = False 
      sleep(0.01) 

    def _send(self, what): 
     self.buffer += what + '\r\n' 
     self.is_writable = True 

    def handle_error(self): 
     log('Error, closing socket!', 'SOCK_CORE') 
     self.close() 

    def run(self): 
     log('Log socket engine initating', 'SOCK_CORE') 
     self.connect((server, server_port)) 

     print self.connected 
     sleep(3) 
     print self.connected 

class start(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
     self.start() 
    def run(self): 
     asyncore.loop(0.1) 

start() 
logDisp = logDispatcher() 
logDisp.run() 
+0

Примечание: Ethernet, локальной сети между i7 Dell Precision M6600 и MacBook Pro - те же спецификации. Задержка не является проблемой, и производительность не должна быть (altho часть сокета может отличаться от MAC, я честно не знаю, если это так, и если это аппаратное/низкое - это программное обеспечение уровня MAC, которое вызывает это) – Torxed

ответ

1
def handle_connect_event(self): 
    self.is_connected = True 

добавив, что к диспетчеру даст вам возможность проверить, если сокет подключен или нет, благодаря какой-то стек trace (python -m trace -t script.py) в Python Мне удалось выяснить, что класс asyncore автоматически создал эту функцию по любой причине, и она называлась постоянно до тех пор, пока сокет был подключен или подключен.

После этого я также заменил поточный asyncore.loop() и заменил его «статическим» размещением, блокирующим ваш основной поток, одна из этих двух комбинаций (или и тех и других) решила проблему на данный момент .. логика isn 't то же самое, что и в моей проблеме, которая мне не нравится, но я предполагаю, что мне нужно будет создать свой собственный dispach_event, как если бы я должен был создать класс GUI OpenGL, где я бы каждый раз вызывал dispatch_event() каждый цикл как в потоке, чтобы «держать вещи в живых» .. это просто мысль ..

во всяком случае, вот рабочий пример:

#!/usr/bin/python 
# -*- coding: iso-8859-15 -*- 
import asyncore, socket 
from threading import * 
from time import sleep 
from os import _exit 
from logger import * 
from config import * 

def _map(): 
    return {} 
def _array(): 
    return [] 

class logDispatcher(Thread, asyncore.dispatcher): 
    def __init__(self, config=None): 
     self.inbuffer = '' 
     self.buffer = '' 
     self.lockedbuffer = False 
     self.is_writable = False 

     self.is_connected = False 

     self.exit = False 
     self.initated = False 

     asyncore.dispatcher.__init__(self) 
     Thread.__init__(self) 

     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     try: 
      self.connect((server, server_port)) 
     except: 
      log('Could not connect to ' + server, 'LOG_SOCK') 
      return None 

     self.start() 

    def handle_connect_event(self): 
     self.is_connected = True 

    def handle_connect(self): 
     self.is_connected = True 
     log('Connected to ' + str(server), 'LOG_SOCK') 

    def handle_close(self): 
     self.is_connected = False 
     self.close() 

    def handle_read(self): 
     data = self.recv(8192) 
     while self.lockedbuffer: 
      sleep(0.01) 

     self.inbuffer += data 


    def handle_write(self): 
     while self.is_writable: 
      sent = self.send(self.buffer) 
      sleep(1) 

      self.buffer = self.buffer[sent:] 
      if len(self.buffer) <= 0: 
       self.is_writable = False 
      sleep(0.01) 

    def _send(self, what): 
     self.buffer += what + '\r\n' 
     self.is_writable = True 

    def run(self): 
     sleep(1) 
     log('Log engine initating (hooking on to main)', 'LOG_CORE') 

     main = None 
     for t in enumerate(): 
      if t.getName() == 'MainThread': 
       main = t 

     log('Log engine attached to main', 'LOG_CORE') 

     while (main and main.isAlive()) and (self.connected or self.is_connected): 
      print 'WHAM', self.connected, self.is_connected 
      sleep(1) 

while 1: 
    logDisp = logDispatcher() 
    asyncore.loop(0.1) 
    log('Logserver disconnected, trying to reconnect!', 'CORE') 
    sleep(10) 
Смежные вопросы