Найти - Пользователи
Полная версия: что я делаю не так [asyncore]
Начало » Python для новичков » что я делаю не так [asyncore]
1
похмелье
привет!

что я хочу:
сервер слушает порт (класс ear) и как только появляется соединение - создаёт класс mouth, который будет обмениваться информацией через это соединение. так же можно инициировать соединение самому (через словарь парамаетров класса mouth), задавая адрес назначения.
далее (теста ради) запускаем отдельным тредом asyncore.loop, а основным пытаемся законнектиться к серверу.

import socket,asyncore

class mouth(asyncore.dispatcher):
def __init__(self,**kwargs):
asyncore.dispatcher.__init__(self)
self.buffer=bytes()
if "sock" in kwargs:
self.socket=kwargs["sock"]
elif "host" in kwargs and "port" in kwargs:
self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
self.connect((kwargs["host"],kwargs["port"]))
self.buffer=bytes("YOINK!","utf-8")
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
print(self.recv(8192))
def writable(self):
return(len(self.buffer)>0)
def handle_write(self):
sent=self.send(self.buffer)
self.buffer=self.buffer[sent:]

class ear(asyncore.dispatcher):
def __init__(self,host,port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
self.bind((host,port))
self.listen(5)
def handle_accepted(self,sock,addr):
print(repr(addr),sock.getsockname())
mouth(sock=sock)

if __name__=="__main__":
ear("localhost",5555)
import threading
threading.Thread(target=asyncore.loop).start()
mouth(host="127.0.0.1",port=5555)
на выходе:
('127.0.0.1', 3487) ('127.0.0.1', 5555)
b''
что я делаю не так?

и ещё хотелось бы задать несколько вопросов касательно “архитектуры” asyncore:
- возможно ли добавлять сокеты в список, который анализирует asyncore.loop?
- если возможно, то как это делать и как разделять сокеты на те, которыми я “слушаю”, которыми “пишу” и т.д.

заранее спасибо!
похмелье
да, разобрался. вместо
self.socket=kwargs["sock"]
следует использовать
self.set_socket(kwargs["sock"])
вопросы в первом посте уже не актуальны. появился другой вопрос. я заглянул в функцию set_socket и add_channel:
    def set_socket(self, sock, map=None):
self.socket = sock
## self.__dict__['socket'] = sock
self._fileno = sock.fileno()
self.add_channel(map)

def add_channel(self, map=None):
#self.log_info('adding channel %s' % self)
if map is None:
map = self._map
map[self._fileno] = self
правильно ли я делаю вывод, что каждый наследник asyncore.dispatcher может “держать” только один сокет? что будет означать, что каждый экземпляр класса соответствует одному сокету, или же каким-то образом можно группировать функционально идентичные сокеты?
если можно, то нужно ли это? влияет ли это на скорость/память?
ntram
VANISHED
py.user.next
ntram, там топик от 2011-го года. Ты его наверх поднимаешь в разделе форума. Люди начинают думать, что человек что-то спросил сегодня и начинают отвечать. Это называется некропостинг.
FishHook
py.user.next
Некротопики поднимают боты. После удаления спама топик выглядит так как будто содержит новые сообщения для мемберов, которые зарегистрировались позднее последнего сообщения в топике
py.user.next
FishHook
После удаления спама топик выглядит так как будто содержит новые сообщения для мемберов, которые зарегистрировались позднее
Ну, он претендовал на ум, постил про уязвимость даже, найденную им, а тут не сообразил, что к чему?
Я вообще не смотрю на новые сообщения на форуме, потому что они малофункциональны. Бывает ещё, что сообщения прочитаешь в топике, а отвечать пранируешь в другой раз, так как времени нет расписывать что-то подробно. Так в другой раз они уже прочитаны и их не надёшь уже.
О том, что я форум читаю вообще каждый раз без входа, так как печенье стирается у меня каждый раз, и новых и старых сообщений в таком анонимном режиме не видно вообще, я даже не говорю. Но я и писал уже, что просматриваю форум через Emacs и в нём помечаю сообщения, которые хочу перечитать потом, потому что в Emacs'е как раз всё сохраняется между запусками.

Это то, как оно выглядит

Открытое сообщение форума


Список новых сообщений форума


На сообщение поставлен тег “s” (сокращение от see again) и вывод отфильтрован дополнительно по этому тегу. Теги придумываются любые - хоть одинарные буквы, хоть слова. Придумаю буквы, потому что их быстрее набирать потом для фильтрации. Остальные новые сообщения скрываются на время этого фильтра по тегу “s”.


Все новые сообщения вперемешку (форум по питону, сайт новостей, есть и другие источники, в числе которых и новые видео с интересующих YouTube-каналов)


Отфильтровал сайт новостей, убрав вывод сообщений с форума по питону. Вверху строка фильтрации, там через восклицательный знак записано, что запрещены все сообщения с подстрокой “pyth”.


Зашёл в новость про Сару Джессику Паркер и читаю её сразу. Если интересная новость, нажимаю букву “b” и страница новости открывается в браузере в полном виде и с картинками.


Поэтому, как видишь, это в сто раз удобнее функционала форума. Если нет времени отвечать на сообщения, а надо ответить через полдня, например, то я их просто тегом “s” помечаю и в следующий раз просто фильтрую по тегу “s” и показываются только они. После ответов в топиках я теги “s” снимаю с них и всё. Так же и видео на YouTube помечаю, когда нет времени смотреть, а видео интересные и надо посмотреть потом. Работает это всё через RSS.
ntram
VANISHED
FishHook
py.user.next
Спасибо, держи нас в курсе течения своей шизофрении
py.user.next
ntram
скрипт работает на RSS?
Это Emacs закачивает через RSS данные с разных сайтов и формирует из них удобную среду. Поэтому я не завишу от особенностей сайтов, от того, как они там помечают новые и старые сообщения. Да, и поэтому мне не нужно подписываться на YouTube-каналы, жать на колокольчик и так далее, потому что у меня и колокольчика нет, я просматриваю YouTube всегда анонимно, не заходя в аккаунты. А все новые выпуски мне показывает Emacs.

FishHook
Спасибо, держи нас в курсе течения своей шизофрении
Ну, это ты мне про форум что-то рассказывать стал. Я-то сам себе среду строю, поэтому уже давным-давно ушёл с этого уровня развития, на котором ты размышляешь. Мне как-то похрен на новые сообщения, я их вижу без всякого форумского функционала.
FishHook
py.user.next

где-то я это уже видел
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB