多线程/进程tcp服务器代码的书写01版本

from socket import *
from threading import  Thread

def main():
    #必须参数
    server_socket = socket(AF_INET,SOCK_STREAM)
    #以免万一是服务器首先发出四次挥手就要等待2SML,防止地址没有被释放
    server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    server_socket.bind(('',6628))
    server_socket.listen(5)

    try:
        while True:
            print ('等待客户端的到来')
            new_socket, client_addr = server_socket.accept()

            print ('为新来的客户端(%s)创建一个线程服务'%str(client_addr))
            print ()
            client_thread = Thread(target=serve_client_thread,args=(new_socket,client_addr))

            client_thread.start()

            #client_thread.join()
            #join不能有!为什么?
            #因为如果有类join()那么主线程必须等待这个子线程执行完毕之后才能继续回去执行while循环
            #结果就是第一个客户端如果一直不结束,后面来的其他客户端就不能正常 与服务器通信
            #最终这就相当于单线程的服务器,根本没用到多线程的优点!!!!
            #自己去试一试 会有更深刻的体验!!!!!!不懂就去运行 从结果分析~~~

            #new_socket.close()
            # 线程中由于共用一个socket所以这里不能写这句不然之后的客户端请求也就无法继续进行了
            # 进程中是不共用的所以不用注释掉这句话!!!
            # 那为什么不用多进程而是用多线程呢?应为进程占的资源大啊~~~~~

    finally:
        server_socket.close()

def serve_client_thread(new_socket, client_addr):

    while True:

        recv_info = new_socket.recv(1024)

        if len(recv_info.decode('gb2312')) > 0:
            print ('client_addr:%s,recv_Info:%s'%(str(client_addr),recv_info.decode('gb2312')))

        else:
            print ('客户端%s关闭~'%str(client_addr))
            new_socket.close()

            break


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值