【问题标题】:Python TCP/IP CommunicationPython TCP/IP 通信
【发布时间】:2019-03-30 02:02:22
【问题描述】:

这是我的 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()

【问题讨论】:

  • 你有什么问题?
  • 我的错在哪里?
  • 程序不工作的具体情况如何?您收到的错误是什么?
  • 我没有错误我说程序正在等待这一行并且在没有连接的情况下停止 sock.connect((TCP_IP, TCP_PORT))

标签: python tcp modbus


【解决方案1】:

我认为您的问题是 IP 地址:10.0.2.2 如此处所述 [Connection to LocalHost/10.0.2.2 from Android Emulator timed out。 您可以将'10.0.2.2' 替换为'localhost' 或尝试查找您的IPv4 地址。

如果您使用 Linux,请在命令提示符中输入 ifconfig 或在 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()

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

【讨论】:

  • 我在这里添加了一些东西:req = struct.pack('12B', 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, int(unitId), 0x03, 0xff, 0xc0, 0x00 , 0x00) sock.send(req) 我有这个错误 """ sock.send(req) BrokenPipeError: [Errno 32] Broken pipe """
【解决方案2】:

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

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

另外,请参阅Python socket connection timeout

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2020-07-16
    • 2015-12-10
    • 2020-03-16
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多