首页 > 编程语言 >python3 tcp_client

python3 tcp_client

时间:2024-10-30 23:33:03浏览次数:1  
标签:socket self tcp try client time print recv python3

tcp_client.py

# -*- coding:utf-8 -*-
# tcp 客户端,使用单例模式实现
# create: 2023-06-26

import socket
import time
import traceback


class TCPConnection:
    __instance = None  # 存储单例对象的类属性

    def __new__(cls, host, port):
        """
       实现单例模式,保证只有一个实例对象
       """
        if cls.__instance is None:
            cls.__instance = super().__new__(cls)
            cls.__instance.host = host
            cls.__instance.port = port
            cls.__instance.socket = None
            cls.__instance.connect()
        return cls.__instance

    def connect(self):
        """
       连接tcp长连接
       """
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.settimeout(10)  # 设置超时时间为5秒
        retry_time = 5
        while retry_time > 0:
            try:
                self.socket.connect((self.host, self.port))
                print('socket connect success')
                break
            except:
                traceback.print_exc()
                print('socket connect failed, retry after 5s')
                time.sleep(5)
                retry_time = retry_time - 1

    def send_message(self, message, listen_long=False):
        """
        发送消息并返回接收到的信息,如果断线则自动重连
        """
        if isinstance(message, str):
            message = message.encode("utf-8")
        if not listen_long:
            try_time = 3
            while try_time > 0:
                try:
                    print("send: ", message.hex())
                    self.socket.sendall(message)
                    print('send success')
                    response = self.socket.recv(2048)
                    print('recv: ', response.hex())
                    return response
                except:
                    traceback.print_exc()
                    print('send failed, retry...')
                    try_time = try_time - 1
                    self.connect()
        else:
            try_time = 3
            response = None
            while try_time > 0:
                try:
                    self.socket.sendall(message)
                    print("send: ", message.hex())
                    print('send success')
                    response = self.socket.recv(2048)
                    while True:
                        print('recv: ', response.hex())
                        tmp_recv = self.socket.recv(2048)
                        if tmp_recv is None:
                            break
                        else:
                            if tmp_recv[-1] == 0xff:
                                response = response + tmp_recv
                                break
                        response = response + tmp_recv
                    return response
                except:
                    traceback.print_exc()
                    print('send failed, retry...')
                    try_time = try_time - 1
                    self.connect()

    def close(self):
        """
       关闭socket连接
       """
        if self.socket:
            self.socket.close()
            self.socket = None
            print('socket connection has been closed')

    def set_host_port(self, host, port):
        """
       修改host和port
       """
        self.host = host
        self.port = port
        #    self.close()
        self.connect()


# 使用示例
if __name__ == '__main__':
    tcp = TCPConnection(host='127.0.0.1', port=12123)
    msg = '{"test":"hello"}'
    recv = tcp.send_message(msg)
    print(recv)

标签:socket,self,tcp,try,client,time,print,recv,python3
From: https://www.cnblogs.com/brian-sun/p/18516827

相关文章

  • JavaEE初阶---网络原理之TCP篇(二)
    文章目录1.断开连接--四次挥手1.1TCP状态1.2四次挥手的过程1.3time_wait等待1.4三次四次的总结2.前段时间总结3.滑动窗口---传输效率机制3.1原理分析3.2丢包的处理3.3快速重传4.流量控制---接收方安全机制4.1流量控制思路4.2剩余空间大小4.3探测包的机制5.拥塞控制--......
  • 【JavaEE初阶】深入理解TCP协议特性之延时应答,捎带应答,面向字节流以及异常处理
     前言......
  • ES操作RestHighLevelClient手册
    //设置分页searchSourceBuilder.from(1);searchSourceBuilder.size(5);//排序searchSourceBuilder.sort("age",SortOrder.DESC);searchSourceBuilder.sort("id",SortOrder.DESC);//数据过滤创建SearchSourceBuilder条件构造......
  • 【重磅新品】芯驿电子 ALINX 推出全新 IP 核产品线,覆盖 TCP/UDP/NVMe AXI IP 核
    在创新加速的浪潮中,为更好地响应客户群需求,芯驿电子ALINX推出全新IP核产品线,致力于为高性能数据传输和复杂计算需求提供高带宽、低延迟的解决方案。发布的第一批IP核包括10GBe/40GBeUDP协议栈IP核、10GbETCP/IP协议栈IP核和NVMeAXIIP核。 ALINX发布的10Gb......
  • TCP攻击实验
       作业题目本实验的学习目标是让学生获得有关漏洞以及针对这些漏洞的攻击的第一手经验。聪明人从错误中学习。在安全教育中,我们研究导致软件漏洞的错误。研究过去的错误不仅有助于学生理解为什么系统容易受到攻击,为什么“看似良性”的错误会变成灾难,以及为什么需要许多安......
  • System.Data.SqlClient老版本引发内存溢出的问题
    有一个朋友和我说他负责的项目有内存溢出的情况,内存一直居高不下达到了8G。生产环境碰到内存溢出的情况我还没有碰到过,这次有机会实践一下,准备试试,拿到了dump文件,压缩包300M,解压出来3G。该事件是发生在2023年,写这篇文件的是已经是2024年了,为什么会间隔这么久才写这篇文章,因为当时......
  • python3 堆相关函数的使用
    215.数组中的第K个最大元素classSolution:deffindKthLargest(self,nums:List[int],k:int)->int:ans=[]foriinrange(k):heapq.heappush(ans,nums[i])foriinrange(k,len(nums)):ifnums[i]>ans[......
  • 【软考】计算机网络 - 网络协议TCP/IP协议的七层网络协议模型和四层网络协议模型,网络
    一、TCP/IP协议的七层网络协议详解计算机网络构建于七层模型之上图注:中继器:信号会随着距离的增加而逐渐衰减,而中继器则接受一端的信息再将其原封不动的发给另一端,起到延长传输距离的作用,而集线器就是多端口的中继器;网桥是用于连接两个同类型网络的设备,交换机则是多端......
  • MaskGCT,AI语音克隆大模型本地部署(Windows11),基于Python3.11,TTS,文字转语音
    前几天,又一款非自回归的文字转语音的AI模型:MaskGCT,开放了源码,和同样非自回归的F5-TTS模型一样,MaskGCT模型也是基于10万小时数据集Emilia训练而来的,精通中英日韩法德6种语言的跨语种合成。数据集Emilia是全球最大且最为多样的高质量多语种语音数据集之一。本次分享一下如何在本地......
  • TCP与UDP的区别和应用场景
    TCP和UDP的区别包括:1.连接方式不同;2.传输可靠性不同;3.数据顺序性不同;4.速度和延迟不同;5.头部大小不同;6.应用场景不同。TCP是一种面向连接、可靠的传输协议,主要用于需要数据完整性和顺序的应用,如Web浏览和电子邮件。而UDP是一种无连接、速度更快但可能丢失数据的协议,常用于流媒体......