![](/img/trans.png)
[英]TCP-IP Communication via Python and an open port of a SSH connection
[英]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.