栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python TCPIP服务器搭建

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python TCPIP服务器搭建

前言

简易TCPIP服务器搭建

代码
import threading
import socket
import time
# 1.创建TCP服务端套接字
# 2.绑定端口号
# 3.设置监听
# 4.等待接收客户端的连接请求
# 5.接收客户端的数据
# 6.发送数据到客户端
# 7.关闭套接字
vaule = '#0#'
k = 21.2
count = 0
lock = threading.Lock()
#处理客户端请求的操作
def handle_client_request(ip_port,new_client):
    global vaule
    nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    print("客户端的ip和端口号为:",ip_port,nowtime)
    while True:
        try:
            recv_data = new_client.recv(1024)
        except Exception as e:
            print(e)
            break
        if recv_data:
            #对二进制数据进行解码
            try:
                recv_content = recv_data.decode("GBK")
            except Exception as e:
                print(e)
                break
            if recv_content[0] == '#':
                lock.acquire()
                vaule = recv_content
                lock.release()
            if recv_content=='get':
                send_data = vaule.encode('GBK')
                new_client.send(send_data)
            nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            print("接收客户端的数据为:",recv_content,ip_port,nowtime)
            #send_content = "问题正在处理中..."
            # 对字符串进行编码
            #send_data = send_content.encode("GBK")
            #发送数据到客户端
            #new_client.send(send_data)
        else:
            #客户端下线了
            nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            print("客户端下线了:",ip_port,nowtime)
            break
    #关闭服务与客户端的套接字
    new_client.close()
    pass




def handle_client():
    global vaule
    global k
    global count
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_client_socket.connect(("tcp.tlink.io", 8647))
    send_content = "WCG686151M761QNV"

    # 对字符串进行编码为二进制数据
    send_data = send_content.encode("GBK")
    tcp_client_socket.send(send_data)
    while True:
        try:
            lock.acquire()
            temp = vaule.split('#')
            lock.release()
            str1 = temp[1]
            vaule1 = str(round(int(str1)/k,2))
            send_data = ('#'+vaule1+'#').encode('GBK')
            tcp_client_socket.send(send_data)
            time.sleep(1)
            count+=1
            #print(count)
            if count==10 :
                count = 0
                send_data = ('Q').encode('GBK')
                tcp_client_socket.send(send_data)
                recv_data = tcp_client_socket.recv(1024)
                #print(recv_data)
                if recv_data.decode('GBK')!='A':
                    tcp_client_socket.close()
                    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    tcp_client_socket.connect(("tcp.tlink.io", 8647))
                    send_content = "WCG686151M761QNV"
                    # 对字符串进行编码为二进制数据
                    send_data = send_content.encode("GBK")
                    tcp_client_socket.send(send_data)
                    nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
                    print('重连',nowtime)
        except Exception as e:
            nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            print('客户端出错:',e,nowtime)
            break
    tcp_client_socket.close()
    pass

def checkThread():
    initThreadsName = 'handle_client'
    while True:
        state = False
        time.sleep(5)  # 隔一段时间重新运行,检测有没有线程down
        nowThreadsName=[]#用来保存当前线程名称
        now=threading.enumerate()#获取当前线程名
        for i in now:
            # nowThreadsName.append(i.name)#保存当前线程名称
            if initThreadsName in i.name:
                state = True
        if state==True:
            pass #当前某线程名包含在初始化线程组中,可以认为线程仍在运行
        else:
            nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
            print('重启线程',nowtime)
            client_thread = threading.Thread(target=handle_client)
            client_thread.start()
    pass


if __name__ == '__main__':
    #AF_INET:IPV4  SOCK_STREAM TCP协议
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #设置端口号复用:服务端程序退出端口号立即释放
    #1.SOL_SOCKET:表示当前套接字
    #2.SO_REUSEADDR:表示复用端口号的选项
    #3.True 确定复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 第一个参数表示IP地址,一般不用指定,第二个参数表示端口号
    tcp_server_socket.bind(("",8080))
    # 服务器最大连接数
    tcp_server_socket.listen(128)
    # 循环等待客户端的连接请求,并返回新的套接字和IP地址和端口号
    client_thread = threading.Thread(target=handle_client)
    client_thread.start()
    check_Thread = threading.Thread(target=checkThread)
    check_Thread.start()
    while True:
        #客户端和服务端建立连接
        new_client,ip_port = tcp_server_socket.accept()
        #创建一个子线程,用来接收客户端的信息
        sub_thread = threading.Thread(target=handle_client_request,args=(ip_port,new_client))
        #设置守护主线程,主线程退出子线程直接销毁
        sub_thread.daemon = True
        #启动子线程
        sub_thread.start()
    #关闭服务端套接字
    #tcp_server_socket.close()
    pass


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/757303.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号