单线程实现socket服务多客户端

服务器:

import socket,time

tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #这句避免再次开启服务器出现端口已被占用
tcp.bind(("",8000))
tcp.listen(128)
tcp.setblocking(False) #设置tcp不堵塞

client_list = list()

while True:
    time.sleep(1)
    try:
        new_socket,client_addr = tcp.accept()
        new_socket.setblocking(False) #设置new_socket不堵塞
    except:
        print("没有新客户端到来..") #因为accept不堵塞,所以当accept没有客户端连接时,就触发异常
    else:
        print("一个新客户端到来") #如果没有发送异常,表示有一个客户端来连接了
        client_list.append(new_socket) #把这个客户端添加到客户端列表中
    print(len(client_list))
for client in client_list: #如果列表为空,则不会进行循环,如果列表中有新客户端,就进行循环 try: recv_date = client.recv(1024) except: print("客户端没有发送数据")#因为recv没有堵塞,所以recv没有收到消息就异常,新客户端没有发送消息会异常 else: #如果recv_data不返还异常,表示客户端发来消息 if recv_date: #如果发来的消息为真,就是真的数据,处理数据即可 print("客户端发送来数据...") else: #否则就是客户端调用了close(),关掉socket,从列表中移除此客户端 client.close() client_list.remove(client) print("客户端关闭")

测试客户端:

import socket

conn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
conn.connect(("127.0.0.1",8000))
conn.send(b"aaa")
conn.close()

 

posted @ 2019-01-13 14:41  greenfan  阅读(437)  评论(0)    收藏  举报