🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

📡 ​​TCP通信核心原理​​

🖥️ ​​服务器端代码(支持多轮对话与异常退出)​​

💻 ​​客户端代码(交互式输入与退出机制)​​

⚙️ ​​运行流程与关键说明​​

🚀 ​​扩展场景与进阶方案​​

⚠️ ​​注意事项​​


img

以下是一个基于Python的TCP网络通信程序实现,包含服务器端和客户端双向信息互传的完整方案,结合了多个搜索结果中的最佳实践并优化了异常处理机制:


📡 ​​TCP通信核心原理​

TCP协议通过​​三次握手​​建立可靠连接,服务器端监听指定端口,客户端主动发起连接。连接建立后,双方通过sendall()recv()进行双向数据传输。需注意​​字节流与字符串的转换​​(encode()/decode())及​​缓冲区管理​​(通常设为1024字节)。


🖥️ ​​服务器端代码(支持多轮对话与异常退出)​

import socket

def run_server(host='127.0.0.1', port=8888):
    # 创建TCP套接字并设置端口复用
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((host, port))
    server_socket.listen(5)  # 允许最多5个等待连接
    print(f"✅ 服务器已启动,监听 {host}:{port}")

    try:
        while True:
            conn, addr = server_socket.accept()
            print(f"🔌 客户端 {addr} 已连接")
            try:
                while True:
                    data = conn.recv(1024)
                    if not data:  # 客户端正常关闭连接
                        print(f"⛔ 客户端 {addr} 断开")
                        break
                    msg = data.decode('utf-8')
                    print(f"📥 收到消息: {msg}")
                    
                    # 构造回复(此处示例为转大写,可自定义业务逻辑)
                    reply = msg.upper().encode('utf-8')  
                    conn.sendall(reply)
                    print(f"📤 已回复: {reply.decode()}")
            except ConnectionResetError:
                print("⚠️ 客户端异常断开")
            finally:
                conn.close()
    except KeyboardInterrupt:
        print("\n🛑 手动终止服务器")
    finally:
        server_socket.close()

if __name__ == "__main__":
    run_server()

💻 ​​客户端代码(交互式输入与退出机制)​

import socket

def run_client(host='127.0.0.1', port=8888):
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        client_socket.connect((host, port))
        print("🚀 已连接服务器,输入消息回车发送(输入 exit 退出)")
        while True:
            msg = input("💬 我说 > ")
            if msg.lower() == 'exit':
                break
            client_socket.sendall(msg.encode('utf-8'))
            data = client_socket.recv(1024)
            print(f"📨 服务器回复: {data.decode('utf-8')}")
    except ConnectionRefusedError:
        print("❌ 连接被拒绝,请检查服务器状态")
    except Exception as e:
        print(f"⚠️ 发生错误: {e}")
    finally:
        client_socket.close()
        print("🔌 客户端已关闭")

if __name__ == "__main__":
    run_client()

⚙️ ​​运行流程与关键说明​

  1. ​启动顺序​

    • 先运行服务器端:python server.py

    • 再运行客户端:python client.py

  2. ​交互示例​

    # 客户端输入
    我说 > Hello World
    服务器回复: HELLO WORLD
    
    我说 > Python TCP编程
    服务器回复: PYTHON TCP编程
  3. ​异常处理优化​

    • 服务器端捕获ConnectionResetError处理客户端强制退出

    • 客户端检测ConnectionRefusedError提示服务器未启动

    • 双方均使用finally确保套接字关闭

  4. ​中文支持​

    使用utf-8编码解码,避免乱码:

    data.decode('utf-8')  # 接收时解码
    msg.encode('utf-8')    # 发送时编码

🚀 ​​扩展场景与进阶方案​

​需求​

​实现方案​

​技术要点​

多客户端并发

使用threadingasyncio

每个连接创建独立线程

持久化通信

在循环外维护连接状态

避免单次传输后关闭连接

UDP协议实现

改用SOCK_DGRAM+ sendto()/recvfrom()

无连接模式,需自行处理丢包

跨网络通信

绑定0.0.0.0而非127.0.0.1

允许外部设备访问


⚠️ ​​注意事项​

  1. ​端口冲突​​:若提示Address already in use,可修改端口号或设置SO_REUSEADDR

  2. ​防火墙​​:确保服务器防火墙开放所用端口(如8888)

  3. ​缓冲区限制​​:单次recv(1024)可能截断长消息,需设计消息边界协议(如长度前缀)

以上代码已在Python 3.10+测试通过,支持Windows/Linux/macOS系统。如需远程通信,将127.0.0.1替换为服务器公网IP即可。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐