当前位置: 首页 > 知识库问答 >
问题:

Python TCP/IP通信

暨弘懿
2023-03-14

这是我的python modbus tcp通信代码,它在这条线路上等待,然后停止连接,这是我的错误:

sock.connect((TCP_IP, TCP_PORT))

(如果我使用从程序也不工作)在我的客户端,我使用这个代码:

TCP_IP='10.0.2.15'
TCP_PORT=502
BUFFER_SIZE=39
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

sock.connect((TCP_IP,TCP_PORT))

这是主控端:

# Create a TCP/IP socket
TCP_IP = '10.0.2.2'
TCP_PORT = 502
BUFFER_SIZE = 39
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((TCP_IP, TCP_PORT))



try:

    unitId = 16  # Plug Socket11
    functionCode = 3  # Write coil

    print("\nSwitching Plug ON...")
    coilId = 1
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, int(unitId), 0x03, 0xff, 0xc0, 0x00,
                  0x00)
    sock.send(req)
    print("TX: (%s)" % req)
    rec = sock.recv(BUFFER_SIZE)
    print("RX: (%s)" % rec)
    time.sleep(2)

    print("\nSwitching Plug OFF...")
    coilId = 2
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, int(unitId), 0x03, 0xff, 0xc0, 0x00,
                  0x00)
    sock.send(req)
    print("TX: (%s)" % req)
    rec = sock.recv(BUFFER_SIZE)
    print("RX: (%s)" % rec)
    time.sleep(2)

finally:
    print('\nCLOSING SOCKET')
    sock.close()

共有2个答案

衡翰翮
2023-03-14

我想你的问题是“为什么sock.connect()调用挂起?”。这是因为默认情况下,它无限期地等待连接。换句话说,调用在默认情况下是“阻塞”的。如果要等待连接最多500毫秒,则需要指定以下内容:

sock.connect(.5) #wait 500 milliseconds for a connection attempt

另外,请参阅Python套接字连接超时

东云
2023-03-14

我认为你的问题是IP地址:10.0.2.2如这里所述[连接到LocalHost/10.0.2.2从Android模拟器超时。您可以将'10.0.2.2'替换为'localhost'或尝试查找您的IPv4地址。

要执行此操作,请在命令提示符下键入ifconfig(如果使用Linux),或在windows中键入ipconfig并搜索IPv4地址。

我使用了一个简单的客户机-服务器示例来运行您的代码,并将'10.0.2.2'替换为'localhost',一切都很顺利。

服务器端:

import socket
import struct
import time

TCP_IP = 'localhost'                 
TCP_PORT = 502
BUFFER_SIZE = 39

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
sock, addr = s.accept()
print 'Connected by', addr
try:
    unitId = 16  # Plug Socket11
    functionCode = 3  # Write coil

    print("\nSwitching Plug ON...")
    coilId = 1
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 
    int(unitId), 0x03, 0xff, 0xc0, 0x00,
    0x00)
    while 1:
        sock.send(req)
        print("TX: (%s)" % repr(req))
        rec = sock.recv(BUFFER_SIZE)
        print("RX: (%s)" % repr(rec))
        time.sleep(2)
        break

    print("\nSwitching Plug OFF...")
    coilId = 2
    req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 
    int(unitId), 
    0x03, 0xff, 0xc0, 0x00,
    0x00)
    while 1:
        sock.send(req)
        print("TX: (%s)" % repr(req))
        rec = sock.recv(BUFFER_SIZE)
        print("RX: (%s)" % repr(rec))
        time.sleep(2)
        break
finally:
    sock.close()

客户端:

import socket

TCP_IP = 'localhost'    
TCP_PORT = 502            
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((TCP_IP, TCP_PORT))

data = sock.recv(1024)
print  repr(data)
while 1:
    sock.send(data)
    print("send back to server: (%s)" % repr(data))
    break

data = sock.recv(1024)
print  repr(data)
while 1:
    sock.send(data)
    print("send back to server: (%s)" % repr(data))
    break
sock.close()

确保在单独的文件/终端中运行服务器和客户端

 类似资料:
  • 我想用AWS Lambda函数实现基本的TCP/IP协议。如果我们把客户机看作一个AWS lambda函数,把服务器看作另一个AWS lambda函数(不确定我们是否可以把客户机和服务器看作是lambda函数),我们是否可以用TCP/IP协议在这两个lambda函数之间建立客户机-服务器通信(这不同于从一个lambda函数调用另一个lambda函数)。我还想知道用java编写的客户机或服务器端套接

  • 问题内容: 我要通过TCP / IP编写程序,我应该通过客户端或服务器发送对象,当我想发送或接收字符串但尝试读取对象时,它是正确的: 我收到一个例外: 它指的是这一行: 这是我的服务器代码: 客户端代码: 谁能解释我发生了什么,这个例外是什么,为什么我收到这个例外? 问题答案: 只是摆脱发送和接收布尔值的麻烦。这是多余的。如果在创建连接时遇到问题,则不会创建套接字:而是抛出异常。您会将所有内容与同

  • 问题内容: 是否可以使用 socat 实用程序在类似ttyS0的串行(调制解调器)设备上获得双向IP隧道?我尝试使用TUN选项,但仍然无法获得结果。 任何建议,欢迎:) 更新: PC1: PC2: 在那之后,我看到tun0接口的两端都有正确的地址,但是我无法彼此ping通。取而代之的是,当我使用远程进程出口发送数据时,tun0设备被破坏了。有什么建议么?.. 更新2: 当我们尝试仅使用socat通

  • 我的一个项目出了问题。我有一个raspberry pi连接到网络摄像头,但我发现这对RPI来说是太多的负载。这就是为什么我决定购买和使用IP摄像头。但唯一的问题是,IP摄像机在它应该放置的地方没有得到wifi接收,但我有一个强大的定向天线,我可以连接到RPI。我要RPI路由互联网流量从摄像头插入以太网,通过WiFi。我不是百分之百确定如何做到这一点,但到目前为止,我已经给予wifi优先于以太网,并

  • 问题内容: 我的任务是对詹金斯的一些工作进行健康检查。这个想法是通过Jenkins rest API获取作业的状态和关联的IP地址,因此我可以使用该信息与另一个Restful API进行接口。我创建了一个Groovy脚本,该脚本成功解析了Jenkins作业并获取了它们的状态(无论它们是否正在运行),但是我还没有找到一种将这些作业与其IP地址关联的方法。有没有办法通过其余的API获取Jenkins中

  • 我对许多AJAX调用运行安全检查,以查看是否有记录在案的相同IP请求。 我使用了以下一组类函数来建立IP(可以通过负载平衡器来实现,因此采用了纵向方法)。 问题是,我的用户通过代理进行操作时遇到了问题。有人能说明原因吗?我已经使用基本免费代理的在线尝试和模拟,但它似乎没有得到可变IP或任何东西-所以我不知道为什么这会说这两个IP不匹配。