14-TCP服务器端框架

目标

  • 能够使用多线程实现同时接收多个客户端的多条信息

1. TCP服务器端

1、实现制定端口监听

2、实现服务器端地址重用,避免"Address already in use" 错误

3、能够支持多个客户端连接

4、能够支持不同的客户端同时收发消息(开启子线程)

5、服务器端主动关闭服务后,子线程随之结束

import socket
import threading


def recv_msg(new_socket):
    # 建立套接字
    while True:
        # 5、接收客户端发送过来的信息
        recv_data = new_socket.recv(1024)

        # 如果数据存在,则对接收到的数据进行转码
        if recv_data:
            re_text = recv_data.decode("gbk")
            print(re_text)
        # 6、给客户端发送确认信息
        else:
            break

        new_socket.send("7878收到,谢谢~".encode("utf-8"))
    # 7、关闭连接
    new_socket.close()  # 表示关闭和客户端的连接


if __name__ == '__main__':

    # 1、建立套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置地址可以重用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

    # 2、绑定端口,绑定7878端口
    tcp_server_socket.bind(("", 7878))

    # 3、将主动模式调整为被动模式
    tcp_server_socket.listen(128)

    while True:
        # 4、接收客户端连接
        new_socket, ip_port = tcp_server_socket.accept()
        print(ip_port)  # 查看已经连接的客户端ip和端口

        # 开启线程
        t1 = threading.Thread(target=recv_msg, args=(new_socket,))
        # 设置线程守护
        t1.setDaemon(True)

        t1.start()

    # 8、不再接收新请求
    tcp_server_socket.close()

运行效果:

tcp-framework

2. 设置守护线程

    # 开启线程
    t1 = threading.Thread(target=recv_msg, args=(new_socket, ))
    # 设置线程守护
    t1.setDaemon(True)

    t1.start()
注意上述代码的 t1.setDaemon(True) 表示守护主线程,如果主线程关闭,子线程也随之结束

如果没有设置守护主线程,那么此时如果服务器端主动结束,子线程则还在继续运行,这就不对了。

image-20180614231810365