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

results matching ""

    No results matching ""