python tcp传字符串

本文介绍了一个简单的TCP字符串收发程序实现,包括服务端与客户端的编程步骤。服务端负责监听连接并接收客户端发送的数据,同时能将接收到的数据转换为大写后回传给客户端。客户端则用于输入字符串并发送给服务端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用tcp进行字符串网络收发。主要分为两个部分:

1、服务端

step1、创建socket、绑定IP和端口号,开启监听;

step2、等待客户端建立socket连接;

step3、接收的字符串流,显示;也可主动发送数据给客户端;

step4、关闭socket通道、关闭server;

2、客户端

step1、创建基于TCP的socket;

step2、连接的IP地址以及端口;

step3、发送,必须用二进制进行发送消息;

step4、关闭连接;

服务端逻辑,serve.py:

#!/usr/bin/env python
# coding: utf-8
import socket

def main():
    # step1、创建socket、绑定IP和端口号,开启监听
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(("127.0.0.1", 8888))
    server.listen(5)  # 服务端可以接收N个链接,但是只能同一时刻回应五个请求.

    # step2、等待客户端建立socket连接
    conn, addr = server.accept()  # 阻塞(等待客户端的连接)
    print("conn & addr:", conn, addr)

    # step3、接收的字符串流,显示
    from_client_data = conn.recv(1024)  # 至多接收1024个字节 阻塞,超过1024分批接收
    print("来自客户端的消息: %s" % from_client_data)  # 打印客户端发送的内容

    # 也可主动发送数据给客户端
    conn.send(from_client_data.upper())  # 给客户端发送内容

    conn.close()  # 关闭socket通道
    server.close()  # 关闭server

if __name__ == "__main__":
    main()

客户端逻辑,client.py:

#!/usr/bin/env python
# coding: utf-8
import socket

def main():
    # step1、创建基于TCP的socket
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # step2、连接的IP地址以及端口
    client.connect(("127.0.0.1", 8888))  # 必须是元组

    # step3、发送,必须用二进制进行发送消息
    date = input("请输入:")
    client.send(date.encode("utf-8"))

    # 接收服务端发送的内容,允许接收服务端至多1024字节
    from_server_date = client.recv(1024)
    print("来自服务端的消息: %s" % from_server_date)

    # step4、关闭连接
    client.close()

if __name__ == "__main__":
    main()

结果:

python serve.py
python client.py

客户端
    请输入:123 
    来自服务端的消息: b'123'
服务端:
    conn & addr: <socket.socket fd=324, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8888), raddr=('127.0.0.1', 54520)> ('127.0.0.1', 54520)
    来自客户端的消息: b'123'

 

<think>好的,我需要帮助用户解决如何使用Python通过Modbus TCP协议读取字符串数据的问题。首先,我得回顾一下用户提供的引用资料,看看有没有相关的信息。 引用[1]提到`pymodbus.client.ModbusTcpClient`类,说明PyModbus库是可行的工具。用户可能已经安装了pymodbus,但需要确认版本是否支持字符串读取。引用[2]讨论了modbus_tk库的使用,但用户可能更倾向于使用pymodbus,因为引用[1]和[3]都涉及到TCP协议的支持。引用[3]提到的Modbus Poll和Slave可以用来测试,用户可能需要这些工具来模拟从机设备,方便调试。引用[4]中的串口调试助手可能不适用,因为用户使用TCP而非串口。 接下来,我需要考虑Modbus协议中如何字符串数据。通常,字符串会被拆分为多个16位寄存器,每个寄存器存储两个字符(ASCII码)。例如,"AB"会占用一个寄存器,值为0x4142。读取时,需要读取连续的寄存器,然后将这些值拼接并转换为字符串。 用户需要示例代码,我应该提供使用pymodbus的步骤。首先,连接到Modbus TCP服务器,然后读取保持寄存器。假设字符串起始地址为0,长度为4个寄存器(8个字符),使用功能码0x03。读取后,将每个寄存器的值转换为字节,再解码为字符串。 可能需要注意的问题包括字节顺序(大端或小端),以及字符串的实际长度。例如,寄存器可能包含填充的空字符,需要截断。此外,异常处理也很重要,比如处理连接错误或无效响应。 最后,用户可能需要知道如何测试代码,建议使用Modbus Slave工具模拟从机设备,配置寄存器中的字符串值,然后运行Python脚本验证结果。同时,提醒用户根据实际情况调整寄存器的起始地址和数量。</think>### 通过Python实现Modbus TCP读取字符串数据的步骤 #### 1. 字符串在Modbus协议中的存储方式 Modbus协议本身没有专门定义字符串数据类型,字符串通常以**ASCII码形式拆分存储在连续的保持寄存器**中。每个寄存器(16位)可存储2个字符,例如字符串`"HELLO"`会占用3个寄存器: - 寄存器0: `0x4845`(对应字符`H`和`E`) - 寄存器1: `0x4C4C`(对应字符`L`和`L`) - 寄存器2: `0x4F00`(对应字符`O`和空填充)[^1] #### 2. Python实现代码(使用PyModbus库) ```python from pymodbus.client import ModbusTcpClient from pymodbus.exceptions import ModbusException def read_modbus_string(host, port, address, length): try: client = ModbusTcpClient(host=host, port=port) client.connect() # 读取保持寄存器(功能码0x03) response = client.read_holding_registers(address, length, slave=1) if response.isError(): print(f"Modbus错误: {response}") return None # 将寄存器值转换为字节序列 byte_data = b'' for reg in response.registers: byte_data += reg.to_bytes(2, byteorder='big') # 大端字节序 # 解码为字符串(去除空字符) decoded_str = byte_data.decode('ascii').rstrip('\x00') return decoded_str except ModbusException as e: print(f"通信异常: {str(e)}") finally: client.close() # 示例调用 result = read_modbus_string("192.168.1.100", 502, address=0, length=4) print(f"读取结果: {result}") ``` #### 3. 关键参数说明 - `host`: Modbus TCP服务器IP地址 - `port`: 默认502端口 - `address`: 寄存器起始地址(如0表示从第一个寄存器开始) - `length`: 需要读取的寄存器数量(根据字符串长度计算) #### 4. 测试建议 1. 使用**Modbus Slave**软件模拟从机设备,在寄存器中写入测试字符串[^3] 2. 运行Python脚本验证读取结果 3. 调试工具推荐:Wireshark抓包分析Modbus TCP报文[^3] #### 5. 常见问题处理 - **字节顺序问题**:若设备使用小端字节序,需修改`to_bytes(2, byteorder='little')` - **编码问题**:非ASCII字符需要使用`utf-8`等编码 - **超时设置**:添加`client.timeout = 3`参数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jingbo1801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值