SELECT版
server代码
大体和之前之前的伪版差不多,其中的思想也是一样的,只不过SELECT是系统给用户提供的接口更加的稳定和成熟
root@iZ947mgy3c5Z:/prodata/scripts# cat real_select_tcp_server.py
import time
import select
from socket import *
def main():
server_socket = socket(AF_INET, SOCK_STREAM)
server_port = ('127.0.0.1', 7788)
server_socket.bind(server_port)
server_socket.listen(5)
socket_list = [server_socket]
while True:
try:
# select.select(rlist, wlist, xlist[, timeout])
# 参数:
# rlist:检查socket可读(收)的socket对象列表
# wlist:检查socket可写(发)的socket对象列表
# xlist:异常列表
# 返回:
# 可读(收)列表:对于server套接字来说就是可以accept了,对于client套接字来说就是可以接收数据了
r_s_list, w_s_list, x_s_list = select.select(socket_list, [], [])
except Exception as e:
# 执行时发现没有打印出任何异常
print(str(e))
# pass
else:
# 遍历可读的socket列表
for rs in r_s_list:
# 如果可读的socket对象是server套接字
if rs == server_socket:
# accept连接,创建client套接字
client_socket, client_addr = server_socket.accept()
# 将client套接字append进检查列表
socket_list.append(client_socket)
else:
# 如果可读socket不是server套接字,则说明是client套接字可以接收数据了
# 接收数据
client_data = rs.recv(1024)
# 判断是否为客户端断开连接
if len(client_data) <= 0:
# 如果是断开连接,则移除client套接字从可读检查列表中
socket_list.remove(rs)
print('someone disconnect...')
else:
# 如果不是断开连接则打印数据
print('[{}]: {}'.format(time.strftime("%Y-%m-%d %H:%M:%S"), client_data))
rs.send(client_data)
time.sleep(0.1)
if __name__ == '__main__':
main()
client代码
root@iZ947mgy3c5Z:/prodata/scripts# cat multi_thread_client.py
from socket import *
from multiprocessing import Pool, current_process
from threading import Thread, current_thread
import time
host_port = ('127.0.0.1', 7788)
def worker():
try:
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(host_port)
while True:
time.sleep(1)
client_socket.send('hi'.encode())
print('[{}]: {}'.format(time.strftime("%Y-%m-%d %H:%M:%S"), current_thread().name))
finally:
client_socket.close()
def main():
t1 = Thread(target=worker, name="t1")
t2 = Thread(target=worker, name="t2")
t3 = Thread(target=worker, name="t3")
t4 = Thread(target=worker, name="t4")
t1.start()
t2.start()
t3.start()
t4.start()
if __name__ == '__main__':
main()
执行效果
server
root@iZ947mgy3c5Z:/prodata/scripts# python3.5 true_select_tcp_server.py
[2018-01-24 10:55:10]: b'hi'
[2018-01-24 10:55:10]: b'hi'
[2018-01-24 10:55:10]: b'hi'
[2018-01-24 10:55:10]: b'hi'
[2018-01-24 10:55:11]: b'hi'
[2018-01-24 10:55:11]: b'hi'
[2018-01-24 10:55:11]: b'hi'
[2018-01-24 10:55:11]: b'hi'
[2018-01-24 10:55:12]: b'hi'
[2018-01-24 10:55:12]: b'hi'
[2018-01-24 10:55:12]: b'hi'
[2018-01-24 10:55:12]: b'hi'
[2018-01-24 10:55:13]: b'hi'
[2018-01-24 10:55:13]: b'hi'
[2018-01-24 10:55:13]: b'hi'
[2018-01-24 10:55:13]: b'hi'
[2018-01-24 10:55:14]: b'hi'
[2018-01-24 10:55:14]: b'hi'
[2018-01-24 10:55:14]: b'hi'
[2018-01-24 10:55:14]: b'hi'
[2018-01-24 10:55:15]: b'hi'
[2018-01-24 10:55:15]: b'hi'
[2018-01-24 10:55:15]: b'hi'
client
root@iZ947mgy3c5Z:/prodata/scripts# python3.5 multi_thread_client.py
[2018-01-24 10:55:10]: t1
[2018-01-24 10:55:10]: t2
[2018-01-24 10:55:10]: t3
[2018-01-24 10:55:10]: t4
[2018-01-24 10:55:11]: t2
[2018-01-24 10:55:11]: t1
[2018-01-24 10:55:11]: t3
[2018-01-24 10:55:11]: t4
[2018-01-24 10:55:12]: t2
[2018-01-24 10:55:12]: t1
[2018-01-24 10:55:12]: t3
[2018-01-24 10:55:12]: t4
[2018-01-24 10:55:13]: t1
[2018-01-24 10:55:13]: t2
[2018-01-24 10:55:13]: t3
[2018-01-24 10:55:13]: t4
[2018-01-24 10:55:14]: t2
[2018-01-24 10:55:14]: t1
[2018-01-24 10:55:14]: t3
[2018-01-24 10:55:14]: t4
[2018-01-24 10:55:15]: t1
[2018-01-24 10:55:15]: t2
[2018-01-24 10:55:15]: t3
[2018-01-24 10:55:15]: t4