简单的client-server socket学习代码,server-end是:
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'))
我的问题是:
1.AFAIK 在 IO 多路复用模型中,epoll.poll 会阻塞,直到一个套接字可用,所以在对其进行操作时,它不应该阻塞(应该直接返回),那么为什么我们应该调用 setblocking( 0)在(1),(2)中,目的是什么?我试过把它们关掉,它仍然有效
2.客户端运行时可能会很慢,大约1s后输出12(这是它发送到服务器的字节),我通过使用time.time()一个一个语句来分析它,然后发现s .connect((host,port)) 通常需要大约 1s,我哪里错了?(这发生在 poll/epoll 上,当使用 select 时,客户端运行速度非常快)