파이썬 asyncore를 사용하여 비동기 클라이언트를 작성하고 몇 가지 문제를 만났습니다.asyncore 클라이언트에서 쓰기 가능한 메소드를 정의하면 클라이언트가 데이터를 매우 느리게 전송합니다.
Asyncore client in thread makes the whole program crash when sending data immediately
을하지만 지금은 다른 문제를 충족 :이의 도움으로이 문제를 해결했다.
내 클라이언트 프로그램 :
import asyncore, threading, socket
class Client(threading.Thread, asyncore.dispatcher):
def __init__(self, host, port):
threading.Thread.__init__(self)
self.daemon = True
self._thread_sockets = dict()
asyncore.dispatcher.__init__(self, map=self._thread_sockets)
self.host = host
self.port = port
self.output_buffer = []
self.start()
def send(self, msg):
self.output_buffer.append(msg)
def writable(self):
return len("".join(self.output_buffer)) > 0
def handle_write(self):
all_data = "".join(self.output_buffer)
bytes_sent = self.socket.send(all_data)
remaining_data = all_data[bytes_sent:]
self.output_buffer = [remaining_data]
def handle_close(self):
self.close()
def handle_error(self):
print("error")
def handle_read(self):
print(self.recv(10))
def run(self):
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((self.host, self.port))
asyncore.loop(map = self._thread_sockets)
mysocket = Client("127.0.0.1",8400)
while True:
a=str(input("input"))
mysocket.send("popo")
그리고 내 서버 프로그램 :
import socket
HOST="127.0.0.1"
PORT=8400
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("socket created")
s.bind((HOST, PORT))
s.listen(1)
print("listen")
conn,addr = s.accept()
print("Accepted. Receiving")
while True:
data = conn.recv(20)
print("Received: ")
print(data)
data = input("Please input reply message:\n").encode("utf-8")
conn.send(data)
print("Data sended. Receiving")
내 문제는 클라이언트에서 서버로 데이터를 전송하는 것은 매우 느린 약 20 ~ 30 초입니다! 그러나 항상 데이터를 성공적으로 보낼 수 있습니다. 클라이언트의 쓰기 가능한 메서드를 주석 처리하면 보내는 프로세스가 매우 빨라집니다. 왜 이런 행동을합니까? 쓰기 가능한 메소드를 사용하려면 어떻게 수정해야합니까? 감사!
저는 파이썬 3으로 서버를 시작하고 파이썬 2로 클라이언트를 시작합니다. 우분투 14.04를 사용합니다.