python socket

Python渗透测试编程基础——Socket网络编程 Socket通信是基于客户端/服务器结构(C/S),可隐藏复杂的TCP/IP协议族,只要遵循Socket的规定就可以进行网络程序开发,简单且开发效率高。Python中的socket模块,提供了套接字编程的大部分功能。支持使用UDP和TCP协议进行网络通信。UDP属于无连接协议,在向接收方发送信息时不需要建立连接,而是直接发送即可。Socket又称"套接字",是计算机间进行网络通信的一套程序接口。UDP的应用:域名系统;socket模块方法如图所示。一、socket编程简介。UDP编程流程及常用的。 阅读详情
import socket
import threading
import sys
import time


class TCPClientTest:
    """TCP客户端 - 适配多客户端服务器,支持发送1/2/3指令并接收响应"""

    def __init__(self, host="127.0.0.1", port=8888):
        self.client_socket = None
        self.host = host
        self.port = port
        self.is_connected = False  # 连接状态标记
        self.recv_thread = None  # 接收响应的线程

    def connect_to_server(self):
        """连接到TCP服务器"""
        try:
            # 创建客户端套接字
            self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            # 设置超时(避免连接卡住)
            self.client_socket.settimeout(10)
            # 连接服务器
            self.client_socket.connect((self.host, self.port))
            self.is_connected = True
            print(f"[客户端] 成功连接到服务器 {self.host}:{self.port}")

            # 启动接收响应的线程(后台持续接收服务器消息)
            self.recv_thread = threading.Thread(target=self.receive_messages, daemon=True)
            self.recv_thread.start()

            return True
        except socket.timeout:
            print(f"[客户端] 连接超时 - 服务器 {self.host}:{self.port} 未响应")
            return False
        except ConnectionRefusedError:
            print(f"[客户端] 连接失败 - 服务器 {self.host}:{self.port} 未启动或拒绝连接")
            return False
        except Exception as e:
            print(f"[客户端] 连接异常: {str(e)}")
            return False

    def receive_messages(self):
        """后台接收服务器响应的线程"""
        print("[接收线程] 已启动,等待服务器消息...")
        while self.is_connected:
            try:
                # 接收服务器数据(缓冲区1024字节)
                recv_data = self.client_socket.recv(1024).decode('utf-8').strip()
                if not recv_data:
                    print("[客户端] 服务器主动断开连接")
                    self.is_connected = False
                    break
                # 打印服务器响应
                print(f"\n[服务器响应] {recv_data}")
                print("根据接收到数据,do something")
                self.recvdata = recv_data
            except socket.timeout:
                continue  # 超时继续等待
            except Exception as e:
                if self.is_connected:
                    print(f"\n[接收异常] {str(e)}")
                break

    def send_command(self, command):
        """发送指令到服务器"""
        if not self.is_connected or self.client_socket is None:
            print("[发送失败] 未连接到服务器")
            return False

        try:
            # 编码并发送指令
            self.client_socket.sendall(command.encode('utf-8'))
            print(f"\n[发送成功] 指令: {command}")
            return True
        except BrokenPipeError:
            print("[发送失败] 连接已断开(Broken Pipe)")
            self.is_connected = False
            return False
        except Exception as e:
            print(f"[发送异常] {str(e)}")
            self.is_connected = False
            return False

    def disconnect(self):
        """断开与服务器的连接"""
        self.is_connected = False
        if self.client_socket:
            try:
                self.client_socket.close()
                print("[客户端] 已断开与服务器的连接")
            except Exception as e:
                print(f"[关闭异常] {str(e)}")


def main():
    # 创建客户端实例(可修改host/port适配你的服务器)
    client = TCPClientTest(host="127.0.0.1", port=8888)

    # 连接服务器
    if not client.connect_to_server():
        sys.exit(1)

    # 交互输入指令
    print("\n=== 客户端操作说明 ===")
    print("输入 1/2/3 发送对应指令到服务器")
    print("输入 quit 退出客户端")
    print("======================\n")

    try:
        while client.is_connected:
            # 手动输入指令
            command = input("请输入指令(1/2/3)或输入quit退出: ").strip()

            # 退出逻辑
            if command.lower() == "quit":
                client.disconnect()
                break

            client.send_command(command)


    except KeyboardInterrupt:
        print("\n\n[用户操作] 检测到Ctrl+C,正在退出...")
        client.disconnect()
    except Exception as e:
        print(f"\n[客户端异常] {str(e)}")
        client.disconnect()


if __name__ == "__main__":
    main()
import socket
import threading
import time
import uuid


class TCPServerTest:
    """TCP服务器测试类 - 支持多客户端并发,接1发送get 1,仅Ctrl+C关闭"""
    def __init__(self):
        self.server_socket = None
        self.is_server_running = False  # 服务器总运行标记
        self.clients = {}  # 客户端连接池: {client_id: (client_socket, address, thread)}
        self.clients_lock = threading.Lock()  # 保护客户端连接池的线程锁
        self.recv_data = {}  # 每个客户端的接收缓冲区: {client_id: data_str}
        self.recv_data_lock = threading.Lock()  # 保护接收缓冲区的锁
        self.HOST = "127.0.0.1"
        self.PORT = 8888
        self.BUFFER_SIZE = 1024

    def is_socket_valid(self, sock):
        """检查套接字有效性"""
        if sock is None:
            return False
        try:
            return sock.fileno() != -1
        except (OSError, AttributeError):
            return False

    def handle_client(self, client_socket, address, client_id):
        """处理单个客户端的通信(独立线程)"""
        print(f"[客户端{client_id}] 已连接 - 地址: {address[0]}:{address[1]}")
        # 连接成功立即返回OK
        self.send_message(client_id, "OK")
        while self.is_server_running:
            try:
                if not self.is_socket_valid(client_socket):
                    break

                # 接收客户端数据
                recv_data = client_socket.recv(self.BUFFER_SIZE).decode('utf-8').strip()
                if not recv_data:  # 客户端主动断开
                    print(f"[客户端{client_id}] 主动断开连接")
                    break

                # 存储接收到的数据到对应客户端的缓冲区
                with self.recv_data_lock:
                    if client_id not in self.recv_data:
                        self.recv_data[client_id] = ""
                    self.recv_data[client_id] += recv_data
                    print(f"[客户端{client_id}] 收到数据: {recv_data} | 累计: {self.recv_data[client_id]}")
            except Exception as e:
                print(f"[客户端{client_id}] 通信异常: {str(e)}")
                break

        # 客户端断开,清理资源
        with self.clients_lock:
            if client_id in self.clients:
                del self.clients[client_id]
        with self.recv_data_lock:
            if client_id in self.recv_data:
                del self.recv_data[client_id]

        client_socket.close()
        print(f"[客户端{client_id}] 连接已清理 | 当前在线客户端数: {len(self.clients)}")

    def send_message(self, client_id, send_data):
        """向指定客户端发送数据"""
        with self.clients_lock:
            if client_id not in self.clients:
                print(f"[发送失败] 客户端{client_id}不存在")
                return -1

            client_socket, _, _ = self.clients[client_id]

        if not self.is_socket_valid(client_socket):
            print(f"[发送失败] 客户端{client_id}套接字无效")
            return -1

        try:
            data_bytes = send_data.encode("utf-8")
            client_socket.sendall(data_bytes)
            print(f"[客户端{client_id}] 发送成功: {send_data}")
            return 1
        except Exception as e:
            print(f"[客户端{client_id}] 发送失败: {str(e)}")
            return -1

    def broadcast_message(self, send_data):
        """广播消息给所有在线客户端"""
        with self.clients_lock:
            online_clients = list(self.clients.keys())

        for client_id in online_clients:
            self.send_message(client_id, send_data)
        print(f"[广播] 已发送: {send_data} | 覆盖客户端数: {len(online_clients)}")

    def start_server(self):
        """启动服务器,持续监听多客户端连接"""
        try:
            # 创建服务器套接字
            self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
            self.server_socket.bind((self.HOST, self.PORT))
            self.server_socket.listen(10)  # 增大监听队列,支持更多并发连接
            self.is_server_running = True

            print(f"[服务器启动成功] 监听 {self.HOST}:{self.PORT}")
            print(f"[核心特性] 多客户端并发 | 接收到1立即发送get 1 | 按 Ctrl+C 关闭服务器\n")

            # 持续接受新客户端连接
            while self.is_server_running:
                try:
                    client_socket, address = self.server_socket.accept()
                    client_id = str(uuid.uuid4())[:8]  # 生成短UUID作为客户端ID

                    # 创建客户端处理线程
                    client_thread = threading.Thread(
                        target=self.handle_client,
                        args=(client_socket, address, client_id),
                        daemon=True
                    )
                    client_thread.start()

                    # 将客户端信息加入连接池
                    with self.clients_lock:
                        self.clients[client_id] = (client_socket, address, client_thread)

                    print(f"[新客户端] ID:{client_id} | 当前在线客户端数: {len(self.clients)}")

                except Exception as e:
                    if self.is_server_running:
                        print(f"[接受连接异常] {str(e)},1秒后重试...")
                        time.sleep(1)

        except Exception as e:
            print(f"[服务器启动失败] {str(e)}")
            self.is_server_running = False
        finally:
            # 关闭服务器时清理所有客户端连接
            self.stop_server()

    def stop_server(self):
        """关闭服务器,清理所有资源"""
        self.is_server_running = False

        # 关闭所有客户端连接
        with self.clients_lock:
            for client_id in list(self.clients.keys()):
                client_socket, _, _ = self.clients[client_id]
                if self.is_socket_valid(client_socket):
                    client_socket.close()
                del self.clients[client_id]

        # 关闭服务器套接字
        if self.is_socket_valid(self.server_socket):
            self.server_socket.close()

        print("[服务器] 已关闭,所有客户端连接已清理")

    def process_client_commands(self):
        """处理客户端指令(核心修改:接1发送get 1),独立线程运行"""
        print("in process_client_commands")

        while self.is_server_running:
            time.sleep(0.1)  # 降低轮询频率,减少资源占用
            with self.recv_data_lock:
                # 遍历所有客户端的接收缓冲区
                for client_id in list(self.recv_data.keys()):
                    data = self.recv_data[client_id]
                    if not data:
                        continue

                    # 核心修改:接收到1,立即发送get 1给对应客户端
                    if "1" == data:
                        print(f"[客户端{client_id}] 检测到指令1,执行响应")
                        self.send_message(client_id, "1 do operator")

                    # 保留2/3指令处理(如需修改可直接改响应内容,格式同上面)
                    if "2" == data:
                        print(f"[客户端{client_id}] 检测到指令2,执行响应")
                        self.send_message(client_id, "2 do operator")

                    if "3" == data:
                        print(f"[客户端{client_id}] 检测到指令3,执行响应")
                        self.send_message(client_id, "3 do operator")

                    self.recv_data[client_id] = ""



if __name__ == "__main__":
    # 实例化服务器
    server = TCPServerTest()

    # 启动服务器主线程(监听客户端连接)
    server_thread = threading.Thread(target=server.start_server, daemon=True)
    server_thread.start()
    time.sleep(2)

    # 测试:启动指令处理线程(核心:接1发get 1)
    # cmd_thread = threading.Thread(target=server.process_client_commands, daemon=True)
    # cmd_thread.start()
    server.process_client_commands()
    # 主线程永久阻塞,仅Ctrl+C退出
    # try:
    #     while True:
    #         time.sleep(1)
    #         # 可选:打印当前在线客户端数(取消注释即可)
    #         # with server.clients_lock:
    #         #     print(f"\r[当前在线] {len(server.clients)} 个客户端", end="")
    # except KeyboardInterrupt:
    #     print("\n\n[用户操作] 检测到Ctrl+C,正在关闭服务器...")
    #     server.stop_server()
    #     time.sleep(1)
    #     print("[服务器] 已完全关闭,程序退出")
python的网络编程(socket) 模块提供了对套接字编程的支持,包括创建、连接、发送和接收数据等操作。使用套接字,可以实现底层的网络通信,并与其他计算机上的应用程序进行数据交互。套接字(Socket):套接字是进行网络通信的基础,它提供了一种抽象机制,通过网络传输数据。 阅读详情

相关推荐

Gamit10.71添加新的天线类型

添加新的天线类型需要涉及到四个文件:antmod.dat,rcvant.dat,guess_rcvant.dat,hi.dat。 注意:格式要一致!!! 举例说明,我要添加一个JCA229的天线(带JCAD天线罩),对应接收机使用的是南方的South Net-S9。

Penny的博客 2713

Python socket详解,全网最全教程

嗨喽,大家好呀~这里是爱看美女的茜茜呐。

m0_72282564的博客 1万+

Metal 一、初识 Metal 及其语言规范

游戏开发者的新的技术平台,该技术能够为3D图像提高 10 倍的渲染性能。苹果2018年推出 Metal,在此之前一直使用OpenGL ES。1图形渲染;2高并发计算。苹果文档给出的 Metal 优化:CPU 低消耗、GPU 高利用、连续处理器并行、有效的资源利用Metal 官方文档。

irainsa的博客 1224

python系列:socket库详解

socket库应用详解

hjz2196987870的博客 1万+

COMSOL实战:薄膜声学超材料模态分析全流程解析(含预应力设置技巧)

本文详细解析了使用COMSOL进行薄膜声学超材料模态分析的全流程,包括预应力设置技巧和共振频率优化方法。通过实际案例和参数设置指南,帮助工程师掌握从几何建模到结果解读的关键步骤,特别适合声学超材料和共振薄膜结构的设计与优化。

ujm5678901的博客 294

新能源知识库(62)组串式、集中式和高压直挂式

因需多台PCS及独立监控设备,单位功率成本比集中式高15%–20%。高压直挂式因省去变压器,大容量项目成本更低(>5MW时优势显著)。组串式储能、集中式储能和高压直挂式储能是当前主流的三类技术路线,其核心差异源于系统架构和控制逻辑的设计差异。组串式交流侧需变压器升压至10kV/35kV,高压直挂式可直接输出6kV/35kV电压,减少转换损耗。多台小功率PCS并联(每簇独立管理)单台大功率PCS(多簇直流侧并联)环流导致容量衰减(损失5%–8%)无变压器损耗(效率>99%)高压直挂电站(≥10MW)

竹君子之家 1517

python之socket编程

Socket是什么呢? socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭) 基本上,Socket 是任何一种计算机网络通讯中最基础的内容。例如当你在浏览器地址栏中输入 http://...

mxh的博客 8万+

鸿蒙平板PC应用开发:在termux中安装ubuntu

打开AVNC点击右上角的设置图标,然后点击 输入 , 点击手势栏目中的 单指轻扫 ,选择滚动远程内容

DMZDAMS的博客 5202

【Python】Socket的简单应用

python socket实现客户端与服务器的通信

RexHa的博客 1万+

Aurix TC3xx系列MCU ResourceM模块配置(多核资源分配)

为减轻主核的负载率或者平衡各个核的资源分配,通常需要把一些MCU内部资源分配到从核上,在EB tresos工具中,通过ResourceM模块实现多核资源分配。

m0_38045338的博客 1389

UNet改进(3):Local Attention增强的UNet网络-医学图像分割

本文提出一种改进的UNet网络,通过引入局部注意力机制增强医学图像分割性能。该方法在传统UNet编码器-解码器结构中,创新性地整合了通道注意力和空间注意力模块,使网络能自适应聚焦关键区域。注意力机制通过特征重标定增强有用信息并抑制噪声,显著提升了小目标分割和边缘检测的精度,同时保持较低计算开销。实验表明,该方法在肿瘤分割等任务中具有更好表现,为医学图像处理提供了新的优化思路。

2501_91516851的博客 2065

Python中Socket编程

目录 Python中Socket编程 1 一、Socket概述 1 二、python中socket模块使用 1 三、socket之聊天室 3 四、socket之端口探测 7 五、scapy之tcp端口探测 11 Python中Socket编程 一、Socket概述 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket即是一种特殊的文件,socket函数就是对其进行的操作(读/写IO、打

weixin_45794666的博客 3931

Oracle EBS Interface/API(43) -自定义AP发票状态说明API

在某项目,客户需求获得AP发票的状态说明,例如对账系统或者某些报表。由于标准系统未提供状态说明,需要通过AP发票的标准Form获得相关业务逻辑,然后自定义AP发票状态说明API。

陈显平的专栏-Oracle EBS 607

python socket模块

原链接:https://blog.youkuaiyun.com/qq_42081843/article/details/83154001#Python__socket__1 Python socket 模块简介 Python 两个基本的 socket 模块。 Socket 类型 套接字格式 socket.AF_UNIX socket.AF_INET socket.A...

houzhyan-博客 2613

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python的socket模块

一、官方文档: https://docs.python.org/3.9/library/socket.html 二、按照官方文档练习 1、Socket families (1)根据系统和构建选项,该模块支持各种套接字家族。即根据创建套接字对象时指定的地址族,自动选择特定套接字对象所需的地址格式。例如: ①指定AF_UNIX,则会使用文件系统编码和'surrogateescape'错误处理程序 ②指定AF_CAN,则可定义网络接口名称,并接收来自该系列所有网络接口的数据包 ③指定AF_ALG,则

weixin_43431593的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python 中 Socket 模块详解

Python 的socket模块提供了强大的网络编程能力。通过了解基础的 Socket 操作、数据发送接收、Socket 选项以及异常处理,开发者可以轻松地实现网络应用。希望这篇博文能帮助你更好地理解和使用 Python 的 Socket 模块。

XMYX-0 2083

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python的Socket编程

python socket编程 介绍socket的来源、socket的编程和函数简介

Ryan 2452

python Socket

python Socket 网络层的“ ip 地址”可以唯一标识网络中的主机,传输层的“协议+端口”可以唯一标识主机中的应用进程(进程), ip 地址+协议+端口就可以标识网络的进程了。 1、TCP 协议,即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。 2、UDP 是无连接不可靠的数据报协议 3、with 上下文管理器(Context Manager),即实现了 __enter__ 和 __exit__ 方法的类型,这对方法称为上下文管理协议(Context Manager

yake1965 724

python socket能做什么_[python]初探socket

1.什么是socket?Socket中文译作:套接字,但是大家一般约定俗称的都用:socket。我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立‘通信’的基础,建立连接,传输数据————‘通信端点’。我的理解:每个socket对象就是一个抽象的‘通信对象’,而‘通信对象’做的事情就是发送或者接受信息。就想生活中:每个联网的计算机就是一个socket对象,每个打电话的人也是...

weixin_39608457的博客 250

Python 中的 Socket 编程入门

Socket 是一个网络编程的接口,提供了网络通信的基础。它使得应用程序能够通过网络互相发送和接收数据。简单来说,Socket 就是一个网络连接的端点,它可以被视作网络通信的“门”,通过它进行数据的发送和接收。Socket 编程是实现网络通信的基础,Python 提供了简单易用的socket模块,方便开发者进行 TCP 和 UDP 通信。通过本文的介绍,你应该对 Python 中的 Socket 编程有了初步的了解。

chusheng1840的博客 2811

socket编程python实现

提供一个socket编程的基本概念和实例

zino00的博客 4049

python socket 简介

Python 提供了两个基本的 socket 模块。 第一个是 Socket,它提供了标准的 BSD Sockets API。 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。 参考:《python3 socketserver模块 网络服务编程框架》https://blog.youkuaiyun.com/whatday/article/details/1...

whatday的专栏 196

使用python进行socket编程

原文URL:https://www6.software.ibm.com/developerworks/cn/education/linux/l-pysocks/section4.html  Python 中的 socket 编程 在所有具有 socket 的语言中,socket 都是相同的 —— 这是两个应用程序彼此进行通信的管道。 前提条件 不管是使用 Python、Perl、Ruby

Gdreamlend的专栏 1963

python socket connect_ex_Python socket学习

本章内容1、socket2、IO多路复用3、socketserverSocketsocket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)基本上,Socket 是任何一种计算机网络通讯中最基础的内容。...

weixin_35197188的博客 3265

python socket connect_ex_python socket

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。 套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。 网络套接字是IP地址与端口的组合。socket相当于一个接口使得我们可以脱离应用层直接和传输层(以及其下的协议层)对接1. socket流程I. 服务端创建socket对象 -> 绑定协议、端口等 ...

weixin_39967405的博客 1941
上一篇: FastAPI传参类型
下一篇: python 多进程
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值