TCP服务器多线程连接—不定长发送数据
一、思路
开一个TCP服务器,每当有新的TCP客户端连接,就会产生新的线程,新的线程对TCP客户端消息进行处理。每个线程发送数据随机都是产生的乱码,发出去并且计算发送的长度,然后阻塞等待新的数据,直到有新的数据产生。
import socket
import threading
import time
import os
import random
def msg(sock, ip_port):
txlength = 0 # 发送数据长度
rxlength = 0 # 接收数据长度
# 3-返回发送数据
while True:
try:
time.sleep(1) # 线程睡眠1秒
data = os.urandom(48 * random.randint(1, 10)) # 随机产生数据
txlength = txlength + len(data)
sock.send(data) # 显示发送数据
print('%s:' % str(ip_port))
print(data) # 显示数据
data = sock.recv(1024) # 接收数据
print(data) # 显示接收数据
rxlength = rxlength + len(data)
print('发送:', str(txlength), ' ,接收: ', str(rxlength))
# 判断连接是否断开
if data is b'':
sock.close()
break
except TimeoutError as n:
sock.close()
# TCP服务器对象
class Tcp_Server(object):
# 初始化服务器
def __init__(self, ip, port):
self.target_ip = ip
self.target_port = port
# 1-绑定IP地址和端口号
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.bind((self.target_ip, self.target_port))
# 2-监听客户端
self.server.listen(128)
while True:
sock, ip_port = self.server.accept() # 接收客户端连接
# 3-只要有新的连接进来就启动线程
if sock is not None:
tid = threading.Thread(target=msg, args=(sock, ip_port,))
tid.start() # 启动线程
print('新用户连接:%s' % str(ip_port))
# 主函数
def main():
Tcp_Server('192.168.7.37', 9001) # 开启建立服务器端
if __name__ == '__main__':
main()