示例:
# -*- coding: utf-8 -*-
import sys
import os
import base64
import socket
import socketserver
import traceback
import struct
import time
import json
head_len = 12
class MyTCPHandler(socketserver.BaseRequestHandler):
def setup(self):
# 客户端链接后的初始化函数
self.ip = self.client_address[0].strip(); # 获取客户端的ip
self.port = self.client_address[1]; # 获取客户端的port
self.request.settimeout(20); # 对socket设置超时时间
self.sock_Cloud_Check = None;
# 获取数据长度
def get_data_length(self) :
# 1、先接收head_len字节长度
header = b""
header_length = 0
while True:
data_tmp = b""
data_tmp = self.request.recv(head_len - header_length)
if data_tmp is None or len(data_tmp) == 0 :
raise EOFError() # 抛出错误
# 计算已经获取的长度
header_length += len(data_tmp)
# 把数据追加到 最终数据 header
header += data_tmp
if header_length == head_len :
break
elif header_length > head_len :
raise EOFError() # 抛出错误
return int(header)
# 获取数据内容
def get_data(self, data_length):
data = b""
data_length_tmp = 0
while True:
# 1、接收报文
data_tmp = b""
data_tmp = self.request.recv(data_length - data_length_tmp)
if not data_tmp:
raise EOFError()
# 2、把数据拼接上,并计算长度
data += data_tmp
data_length_tmp = len(data)
if data_length_tmp == data_length:
return data
elif data_length_tmp > data_length:
raise EOFError()
# 处理数据
def deal_data(self, data):
print("================\njust get data:")
print(data)
print("==========================\n\n")
return 0
# 继承BaseRequestHandler基类,然后必须重写handle方法,并且在handle方法里实现与客户端的所有交互
def handle(self):
try:
while True:
# 1、获取数据的长度
data_length = self.get_data_length()
print(data_length)
if data_length == 0:
continue
# 2、获取数据
data = self.get_data(data_length)
print(data)
# 3、处理数据
self.deal_data(data)
except socket.timeout:
# 捕捉连接超时的情况
print("timeout ==== " + traceback.format_exc());
except Exception :
self.request.close()
def finish(self):
# 客户端断开后的处理函数
# self.request.shutdown(2)
self.request.close()
# =======================================================================================
# ----程序入口函数---------------------------------------------------------------------------
if __name__ == "__main__":
# IP 和 端口设置
IP = "0.0.0.0"
PORT = 7788
# 1、设置一个监听服务,对于来的连接,用 MyTCPHandler 类生成一个对象做处理
socketserver.ThreadingTCPServer.allow_reuse_address = True
#server = socketserver.ForkingTCPServer((IP,PORT), MyTCPHandler)
server = socketserver.ThreadingTCPServer((IP,PORT), MyTCPHandler)
# 2、设置监听套接字属性
l_onoff = 1
l_linger = 0
server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger))
server.allow_reuse_address = True;
# 3、启动这个server,server会一直运行,除非按ctrl-C停止
server.serve_forever();
服务端启动

客户端发送数据

服务端接收数据

发表回复