Форум сайта python.su
Twisted TCP Clients
Добрый день уважаемые знатоки Python. С недавних пор перешел на Python, данный язык у меня вызывает затруднения, прошу помощи с задачей.
Необходима программа, которая использует множество не блокирующих подключений к разным серверам. Под свою задачу я нашел framework twisted. Нашел пример использования.
from twisted.internet import reactor, protocol # a client protocol class EchoClient(protocol.Protocol): """Once connected, send a message, then print the result.""" def connectionMade(self): self.transport.write(b"hello, world!") def dataReceived(self, data): "As soon as any data is received, write it back." print("Server said:", data) self.transport.loseConnection() def connectionLost(self, reason): print("connection lost") class EchoFactory(protocol.ClientFactory): protocol = EchoClient def clientConnectionFailed(self, connector, reason): print("Connection failed - goodbye!") reactor.stop() def clientConnectionLost(self, connector, reason): print("Connection lost - goodbye!") reactor.stop() # this connects the protocol to a server running on port 8000 def main(): f = EchoFactory() reactor.connectTCP("localhost", 1234, f) reactor.run() # this only runs if the module was *not* imported if __name__ == '__main__': main()
Офлайн
В твоей задаче нужен встроенный socket модуль.
from socket import socket; from threading import Thread stop = False sock = socket() sock.bind(('localhost', 1234)) sock.listen() sockets = [] def accepting(): while not stop: u, ip = sock.accept() u.setblocking(False) sockets.append((u, ip)) def receiving(): while not stop: socks = sockets[:] # Если массив изменит размер во время итерации будет ошибка, а потока два for sock_ in socks: try: data = sock_[0].recv(10000) # Измени размер если известен фиксированый размер пакетов _ = 1 / bool(data) except OSError: continue # ничего нет except ZeroDivisionError: # сокет отрубился sockets.pop(sockets.index(sock_)) sock_[0].close() continue try: print(data.decode()) except UnicodeDecodeError: print('data decoding failure') # дата не текст thrd1, thrd2 = Thread(target=accepting), Thread(target=receiving) thrd1.start() thrd2.start() while True: if input("Type STOP to stop server: ") == "STOP": stop = True for sock_ in sockets: sock_[0].close() break
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Отредактировано DamMercul (Авг. 27, 2018 22:20:34)
Офлайн