代码简易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



