コードを研究する単純なクライアントサーバーソケット、サーバー側は次のとおりです。
import socket,select,time
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host,port))
s.listen(50)
s.setblocking(0) # (1)
fdmap = {s.fileno():s}
p = select.epoll()
p.register(s)
while True:
events = p.poll()
for fd,event in events:
if fd is s.fileno():
c,addr = s.accept()
c.setblocking(0) #(2)
print('Got connection from: ',addr)
p.register(c)
fdmap[c.fileno()] = c
elif event & select.EPOLLIN:
data = fdmap[fd].recv(1024)
if not data:
print('disconnected')
p.unregister(fd)
del fdmap[fd]
else:
print(data)
クライアントエンドは
import socket,time
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host,port))
print(s.send(b'hello server'))
私の質問: 0) (1),(2)の目的は何ですか? 私はそれらを延期しようとしましたが、それでも機能します
2.実行中、クライアントエンドは遅くなる可能性があり、約1秒後に12(サーバーに送信するバイト)を出力し、time.time()ステートメントを1つずつ使用してプロファイリングし、s .connect((host,port)) は通常約 1 秒かかりますが、どこが間違っていますか? (これは poll/epoll で発生し、select を使用すると、クライアント側が非常に高速になります)