简体   繁体   English

Python TCP/IP 通信

[英]Python TCP/IP Communication

This is my python modbus tcp communication code and it wait at the this line and than stopping for the connection where is my fault:这是我的 python modbus tcp 通信代码,它在这条线上等待,而不是停止连接哪里是我的错:

sock.connect((TCP_IP, TCP_PORT))

(if i use slave program also not working) At the my client side i am using this code: (如果我使用从属程序也不工作)在我的客户端我使用这个代码:

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))

This is the master side:这是主端:

# 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()

I think your problem is the IP address: 10.0.2.2 as stated here [ Connection to LocalHost/10.0.2.2 from Android Emulator timed out .我认为您的问题是 IP 地址: 10.0.2.2如此处所述 [ 从 Android 模拟器连接到 LocalHost/10.0.2.2 超时 You can replace '10.0.2.2' with 'localhost' or try to find your IPv4 address.您可以将'10.0.2.2'替换为'localhost'或尝试查找您的IPv4地址。

To do so type ifconfig in your command prompt if you use Linux or type ipconfig in windows and search for the IPv4 address.为此,如果您使用 Linux,请在命令提示符中键入 ifconfig 或在 Windows 中键入 ipconfig 并搜索IPv4地址。

I used a simple client-server example to run your code and replaced '10.0.2.2' with 'localhost' and everything went fine.我使用了一个简单的客户端-服务器示例来运行您的代码,并将'10.0.2.2'替换为'localhost' ,一切正常。

server side:服务器端:

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()

client side:客户端:

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()

make sure you run server and client in seperate files/terminals确保在单独的文件/终端中运行服务器和客户端

I think your question is "Why is the sock.connect() call hanging?".我认为您的问题是“为什么 sock.connect() 调用挂起?”。 That's because by default it waits for a connection indefinitely.那是因为默认情况下它会无限期地等待连接。 In other words, the call is 'blocking' by default.换句话说,默认情况下调用是“阻塞”的。 If you want to only wait up to 500 milliseconds for a connection, you need to specify this:如果您只想等待最多 500 毫秒的连接,则需要指定以下内容:

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

Also, see Python socket connection timeout另请参阅Python 套接字连接超时

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM