簡體   English   中英

Python TCP/IP 通信

[英]Python TCP/IP Communication

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

我認為您的問題是 IP 地址: 10.0.2.2如此處所述 [ 從 Android 模擬器連接到 LocalHost/10.0.2.2 超時 您可以將'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()

確保在單獨的文件/終端中運行服務器和客戶端

我認為您的問題是“為什么 sock.connect() 調用掛起?”。 那是因為默認情況下它會無限期地等待連接。 換句話說,默認情況下調用是“阻塞”的。 如果您只想等待最多 500 毫秒的連接,則需要指定以下內容:

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

另請參閱Python 套接字連接超時

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM