Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用 Python 来实现客户端或服务器(TCP/IP 协议)

用 Python 来实现客户端或服务器(TCP/IP 协议)

原创
作者头像
时代疯
发布于 2025-01-22 08:32:20
发布于 2025-01-22 08:32:20
26502
代码可运行
举报
运行总次数:2
代码可运行

Python 来实现创建一个简单的客户端或服务器,可以使用 Python 的内置库 socket。这个库提供了对底层 TCP/IP 协议的访问,可以用来编写网络程序。

以下是一些简单的示例代码

示例 1:创建一个简单的 TCP 服务器

以下代码创建了一个简单的 TCP 服务器,会监听指定的端口,并接受客户端的连接。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import socket

def tcp_server():
    # 创建一个 TCP 套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 绑定地址和端口
    host = "127.0.0.1"  # 本地主机地址
    port = 12345        # 监听端口
    server_socket.bind((host, port))
    
    # 开始监听
    server_socket.listen(5)
    print(f"Server listening on {host}:{port}")
    
    try:
        while True:
            # 接受客户端连接
            client_socket, client_address = server_socket.accept()
            print(f"Connection from {client_address}")
            
            # 接收客户端发送的数据
            data = client_socket.recv(1024)  # 缓冲区大小为 1024 字节
            print(f"Received data: {data.decode()}")
            
            # 向客户端发送响应
            client_socket.send("Hello from server!".encode())
            
            # 关闭客户端连接
            client_socket.close()
    except KeyboardInterrupt:
        print("Server is shutting down.")
    finally:
        server_socket.close()

if __name__ == "__main__":
    tcp_server()

示例 2:创建一个简单的 TCP 客户端

以下代码创建了一个简单的 TCP 客户端,它会连接到服务器并发送数据。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import socket

def tcp_client():
    # 创建一个 TCP 套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 服务器地址和端口
    host = "127.0.0.1"
    port = 12345
    
    # 连接到服务器
    client_socket.connect((host, port))
    print(f"Connected to {host}:{port}")
    
    # 向服务器发送数据
    message = "Hello from client!"
    client_socket.send(message.encode())
    
    # 接收服务器响应
    response = client_socket.recv(1024)
    print(f"Received response: {response.decode()}")
    
    # 关闭连接
    client_socket.close()

if __name__ == "__main__":
    tcp_client()

说明

服务器端

  • 使用 socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建一个 TCP 套接字。
  • 使用 bind() 方法绑定到本地地址和端口。
  • 使用 listen() 方法开始监听连接。
  • 使用 accept() 方法接受客户端连接。
  • 使用 recv() 方法接收数据,使用 send() 方法发送数据。

客户端

  • 使用 socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建一个 TCP 套接字。
  • 使用 connect() 方法连接到服务器。
  • 使用 send() 方法发送数据,使用 recv() 方法接收服务器响应。

运行方式

  • 先运行服务器代码,然后运行客户端代码。
  • 客户端会连接到服务器,发送消息,并接收服务器的响应。

socket库的用途

1. UDP 通信

除了 TCP,socket 库也支持 UDP(用户数据报协议)。UDP 是一种无连接的协议,适合对实时性要求较高的应用(如视频流、游戏等),但不保证数据的可靠传输。

示例:UDP 服务器和客户端

UDP 服务器:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import socket

def udp_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    host = "127.0.0.1"
    port = 12345
    server_socket.bind((host, port))
    print(f"UDP Server listening on {host}:{port}")

    while True:
        data, client_address = server_socket.recvfrom(1024)
        print(f"Received data from {client_address}: {data.decode()}")
        server_socket.sendto("Hello from UDP server!".encode(), client_address)

if __name__ == "__main__":
    udp_server()

UDP 客户端

代码语言:python
代码运行次数:2
运行
AI代码解释
复制
import socket

def udp_client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    host = "127.0.0.1"
    port = 12345

    message = "Hello from UDP client!"
    client_socket.sendto(message.encode(), (host, port))

    response, server_address = client_socket.recvfrom(1024)
    print(f"Received response from {server_address}: {response.decode()}")

    client_socket.close()

if __name__ == "__main__":
    udp_client()

2. 多线程或多进程网络服务

socket 库可以与 Python 的 threadingmultiprocessing 模块结合,实现多线程或多进程的网络服务,从而提高服务器的并发处理能力。

示例:多线程 TCP 服务器
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import socket
import threading

def handle_client(client_socket, client_address):
    print(f"Connection from {client_address}")
    while True:
        data = client_socket.recv(1024)
        if not data:
            break
        print(f"Received data: {data.decode()}")
        client_socket.send(data)
    client_socket.close()
    print(f"Connection closed with {client_address}")

def tcp_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = "127.0.0.1"
    port = 12345
    server_socket.bind((host, port))
    server_socket.listen(5)
    print(f"Server listening on {host}:{port}")

    while True:
        client_socket, client_address = server_socket.accept()
        client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
        client_thread.start()

if __name__ == "__main__":
    tcp_server()

3. 自定义协议开发

socket 库允许你直接操作网络数据包,因此可以用于开发自定义协议。你可以定义自己的数据包格式,并通过 socket 进行数据的收发和解析。

示例:自定义协议
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import socket

def custom_protocol_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = "127.0.0.1"
    port = 12345
    server_socket.bind((host, port))
    server_socket.listen(5)
    print(f"Custom Protocol Server listening on {host}:{port}")

    while True:
        client_socket, client_address = server_socket.accept()
        print(f"Connection from {client_address}")

        # 接收数据并解析自定义协议
        data = client_socket.recv(1024)
        header = data[:4]  # 假设前4字节是自定义协议头
        payload = data[4:]  # 剩余部分是数据负载
        print(f"Header: {header}, Payload: {payload.decode()}")

        # 发送响应
        response = b"ACK" + payload
        client_socket.send(response)
        client_socket.close()

if __name__ == "__main__":
    custom_protocol_server()

4. 网络扫描和调试

socket 库可以用于网络扫描、端口检测等调试任务。例如,你可以编写一个简单的端口扫描器,检测某个主机上哪些端口是开放的。

示例:简单端口扫描器
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import socket

def port_scan(host, start_port, end_port):
    open_ports = []
    for port in range(start_port, end_port + 1):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(1)  # 设置超时时间
        result = sock.connect_ex((host, port))
        if result == 0:
            open_ports.append(port)
        sock.close()
    return open_ports

if __name__ == "__main__":
    host = "127.0.0.1"
    start_port = 1
    end_port = 1024
    open_ports = port_scan(host, start_port, end_port)
    print(f"Open ports on {host}: {open_ports}")

5. 基于套接字的中间件或代理

你可以使用 socket 库实现简单的中间件或代理服务器,例如一个 HTTP 代理或 TCP 中转服务。

示例:简单的 TCP 中转代理
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import socket
import threading

def forward_data(src_socket, dst_socket):
    while True:
        data = src_socket.recv(1024)
        if not data:
            break
        dst_socket.send(data)
    src_socket.close()
    dst_socket.close()

def tcp_proxy():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(("127.0.0.1", 8080))
    server_socket.listen(5)
    print("TCP Proxy listening on 127.0.0.1:8080")

    while True:
        client_socket, client_address = server_socket.accept()
        print(f"Connection from {client_address}")

        # 连接到目标服务器
        target_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        target_socket.connect(("127.0.0.1", 8000))

        # 创建两个线程进行双向数据转发
        client_to_target = threading.Thread(target=forward_data, args=(client_socket, target_socket))
        target_to_client = threading.Thread(target=forward_data, args=(target_socket, client_socket))
        client_to_target.start()
        target_to_client.start()

if __name__ == "__main__":
    tcp_proxy()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
打破网络次元壁:NAT 穿透与内网打洞的 “Matrix 式” 通信革命
在现代网络环境中,NAT (网络地址转换) 设备如同门卫一般守护着内网安全,但同时也形成了通信壁垒。据统计,超过 85% 的家庭和企业网络使用 NAT 设备实现多设备共享公网 IP,这使得内网设备之间或与外部网络的直接通信变得困难。
羑悻的小杀马特.
2025/05/30
1080
打破网络次元壁:NAT 穿透与内网打洞的 “Matrix 式” 通信革命
​TCP/IP协议中的序号、确认与重传机制:深入理解与实践
当我们谈论网络通信,尤其是基于TCP/IP协议的网络通信时,我们经常会听到“序号”、“确认”和“重传”这些术语。这些机制是TCP协议中确保数据可靠传输的关键部分。在本篇博客中,我们将深入了解这些概念,并通过代码实践来进一步理解它们的工作原理。
炒香菇的书呆子
2023/12/08
1.7K3
Python学习笔记
Python允许你同时为多个变量赋值。例如:a=b=c=1 a, b, c = 1, 2, "runoob"
用户11062199
2024/05/30
1160
五行代码创建一个Python TCP服务器
我有个简单的需求,就是从C#端发送数据到Python端处理,得益于Python的众多库,让很多需要大量代码去造轮子的工作得以幸免。
keyle
2024/11/01
990
五行代码创建一个Python TCP服务器
Python从入门到精通:一步步掌握Python编程
Python是一种简单易学但功能强大的编程语言,广泛应用于数据科学、Web开发、人工智能等领域。无论您是初学者还是有一定编程经验的开发者,本文将带您逐步学习Python,从入门到精通。我们将涵盖Python的基础知识、面向对象编程、文件处理、网络编程等内容,并通过代码示例帮助您加深理解。
海拥
2023/07/24
3090
Python从入门到精通:一步步掌握Python编程
从入门到进阶-使用 Python 构建高效的聊天服务器
文章链接:https://cloud.tencent.com/developer/article/2466331
一键难忘
2024/11/20
2310
Python系列(十二):Python 网络编程:构建互联互通的世界
今天推荐的文章【Linux工具|split分割文件后增加后缀名称(后记)】,作者【Aion】,二话不说上链接:https://cloud.tencent.com/developer/article/2470895 ,这篇文章深入介绍了linux中怎么给用spilt分割的文件加后缀名。
Pocker_Spades_A
2024/12/05
1510
Python系列(十二):Python 网络编程:构建互联互通的世界
Python 实战:手把手教你打造自己的聊天室
创建一个简单的聊天室应用是学习网络编程的一个很好项目。通过这个项目,可以了解如何使用Python的套接字编程来实现客户端和服务器之间的通信。本文将详细介绍如何使用Python创建一个基本的聊天室,包括服务器端和客户端的实现,并包含相应的示例代码。
sergiojune
2024/07/10
2650
Python 实战:手把手教你打造自己的聊天室
网络协议解析: 探索TCP、UDP、QUIC和WebRTC
在现代互联网通信中,网络协议扮演着至关重要的角色。TCP、UDP、QUIC和WebRTC是网络中常见的协议,它们在不同的应用场景下发挥着各自的作用。本篇文章将深入探索这些协议,帮助读者更好地理解它们的特点和用途。
大盘鸡拌面
2023/11/22
9920
50行Python代码实现代理服务器的详细教程
代理服务器是一种位于客户端与目标服务器之间的中间服务器,它可以代表客户端发送请求,并将响应返回给客户端。通过搭建自己的代理服务器,我们可以实现请求的拦截、修改和转发等功能。本文将为大家介绍如何使用50行Python代码实现代理服务器。
华科云商小徐
2023/09/21
3.9K0
Python网络编程:构建网络应用与通信
Python是一门强大的编程语言,具备出色的网络编程能力。无论您是构建Web应用、实现网络通信还是创建分布式系统,Python都提供了丰富的工具和库来简化网络编程任务。本文将深入探讨Python网络编程的基础知识、创建服务器和客户端应用程序、以及常见的网络通信模式,同时附带详细的代码示例。
海拥
2023/09/19
3370
Python网络编程:构建网络应用与通信
【详解】Python3.6SocketTypeError:abytes-likeobjectisrequired,not'str'
在使用Python进行网络编程时,​​socket​​模块是一个非常重要的工具。它提供了低级别的网络接口,用于实现客户端和服务器之间的通信。然而,在使用Python 3.6的​​socket​​模块时,你可能会遇到一个常见的错误:​​TypeError: a bytes-like object is required, not 'str'​​。本文将探讨这个错误的原因,并提供解决方法。
大盘鸡拌面
2025/05/11
770
Python简单实现Web服务器
import socket import re import gevent from gevent import monkey monkey.patch_all()# 识别等待时间,让协程切换 def client_handler(client_socket): '''接收客户端链接请求,响应对应的的数据''' # 接收数据 request_data = client_socket.recv(4096) # 判断是否接收到数据 if not request_da
py3study
2020/01/06
1.2K0
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
在当今高度互联的世界中,不同设备间的数据交换变得日益频繁。无论是简单的客户端-服务器架构,还是复杂的分布式系统,都需要一种可靠的方式来实现节点间的通信。Python内置的socket模块正是为此而生,它提供了底层的网络访问接口,允许我们直接控制数据包的发送与接收过程,从而实现自定义的网络协议设计。这使得socket成为开发各类网络应用时不可或缺的一部分。
科技新语
2024/10/24
4850
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
边缘计算与网络协议: 支持边缘计算场景的设计与优化
随着物联网和云计算的快速发展,边缘计算作为一种处理数据的新模式受到了广泛关注。边缘计算将计算能力推向物理世界的边缘,通过在离数据源更近的位置进行计算和存储,减少了数据传输的延迟和带宽消耗。然而,要实现高效的边缘计算,网络协议的设计和优化非常重要。本文将介绍边缘计算的基本概念,并探讨支持边缘计算场景的网络协议的设计与优化方法。
大盘鸡拌面
2023/11/22
3800
Python 套接字详解:与网络通信的温柔邂逅
网络世界,犹如一片无垠的海洋,充满了无限的可能性和无尽的探索。而在这个浩瀚的网络宇宙中,Python 语言以其简洁优雅、功能丰富而备受青睐。在 Python 的世界里,有一个神奇的工具,它就像是一座桥梁,将不同的计算机连接起来,实现数据的传输和通信,它就是套接字(Socket)。
繁依Fanyi
2024/02/07
1990
Python 开发web服务器,多进程优化
前面写了两个篇章,主要介绍了使用tcp开发web服务器的功能。 Python 开发Web静态服务器 - 返回固定值:胖子老板,来包槟榔 Python 开发web服务器,返回HTML页面
Devops海洋的渔夫
2019/05/31
4.8K1
30天拿下Python之使用网络
在上一节,我们介绍了如何在Python中使用Json,包括:Json序列化、Json反序列化、读Json文件、写Json文件、将类对象转换为Json、将Json转换为类对象等内容。在这一节,我们将介绍如何在Python中使用网络。Python网络编程覆盖的范围非常广,包括:套接字编程、socketserver、HTTP和Web开发、异步编程和asyncio等。在本专栏中,我们将只介绍比较基础的套接字编程和socketserver。
用户6256742
2024/06/30
1860
构建用于复杂数据处理的高效UDP服务器和客户端 - plus studio
在当今快速发展的网络通信世界中,理解和应用各种通信协议至关重要。UDP(用户数据报协议)以其低延迟和高效率的特点,在实时数据传输中扮演着关键角色。本文将详细探讨如何使用Python实现UDP服务器和客户端,以处理复杂数据格式。
plus sign
2024/02/29
4050
掌握Python的网络编程:套接字编程入门
随着互联网的快速发展,网络编程成为了现代软件开发中不可或缺的一部分。Python作为一种广泛使用的编程语言,提供了丰富的库和工具,使得网络编程变得简单而强大。本文将详细介绍Python中的套接字编程,帮助您入门网络编程。
网络技术联盟站
2023/07/13
3100
推荐阅读
相关推荐
打破网络次元壁:NAT 穿透与内网打洞的 “Matrix 式” 通信革命
更多 >
LV.2
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档