【Python】实现简单的socket通信


背景:做测试工作时,经常碰到只做上游,或只做下游项目的情况。此时需要自己写脚本模拟另一端的数据。本文在此记录如何实现一个简单的socket通信。

client.py


# 导入socket库
import socket
import threading
import time

HOST = '127.0.0.1'
POST = 50009

def loop():
    # 创建一个socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # AF_INET指定使用IPv4协议,SOCK_STREAM指定使用面向流的TCP协议
    # 建立连接:
    s.connect((HOST, POST)) # 服务器的IP地址和端口号
    n = 0
    while n < 10:
        n = n + 1
        data_heartbeat = b'$000001#'
        # 发送数据
        s.sendall(data_heartbeat)
        time.sleep(1)
        # 打印接收服务端的数据
        print(s.recv(1024).decode("gbk"))# 每次最多接收1k字节,编码是gbk


for i in range(3):
    t= threading.Thread(target=loop, name='LoopThread').start()

server.py

import socketserver
import time


class Handler(socketserver.BaseRequestHandler):

    def setup(self):
        """连接成功,塞入连接池"""
        self.request.sendall("connect success!".encode(encoding='gbk'))  # 向客户端发送连接成功信息
        print("Connected by ", self.client_address)
        socket_request_pool.append(self.request)  # 当前socket连接对象放入连接池

    def handle(self):
        """ 收到消息处理,异常或空消息,断开连接,心跳则返回消息"""

        try:
            while True:
                self.data = self.request.recv(1024)
                print("online num", len(socket_request_pool))
                print("{} send:".format(self.client_address), self.data.decode(encoding="gbk"))
                if not self.data:
                    print("Connection lost")
                    self.remove()
                    break
                self.data_str = self.data.decode('GBK')  # 接收到的数据从byte-->str ,gbk编码
                self.data_content = self.data_str.strip('$#')  # 去掉首尾字符
                if len(self.data_content) == 6:
                    self.request.sendall(self.data)  # 发送收到的内容,即心跳协议的响应
                    time.sleep(2)
                    print("服务端发送心跳响应成功," + '终端号:' + self.data_content + ',' + time.strftime("%Y-%m-%d %H:%M:%S",
                                                                                            time.localtime()))
        except Exception as e:
            print(self.client_address, "Connection lost")
            self.remove()

        finally:
            self.request.close()

    def finish(self):
        """ 环境清理,在handle()之后执行清除操作,默认什么都不做,
        如果setup()和handle()方法都不生成异常,则无需调用该方法"""
        print("client clean", self.client_address)

    def remove(self):
        """连接断开后,从连接池中删除socket对象"""
        print("client remove")
        socket_request_pool.remove(self.request)
        print("online num: ", len(socket_request_pool))

if __name__ == '__main__':
    ADDRESS = ('127.0.0.1', 50009)
    socket_request_pool = []  # 连接池
    server = socketserver.ThreadingTCPServer(ADDRESS, Handler)
    server.serve_forever()


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM