繁体   English   中英

多个 TCP 套接字连接 Python

[英]Multiple TCP socket connections Python

我是套接字编程的新手,我正在努力使用多个 TCP 套接字连接和交换信息。

我有两个用 C 编写的开发板和一个带有 Python 脚本的 PC 的设置。 两块板和 PC 通过 LAN 电缆连接到交换机。 两个开发板都被编程为从 PC 接收到数据后立即发送回“OK”。

我想连接到两个电路板并在使用 Python 脚本发送和接收信息时保持套接字打开。 如果我只能连接到一个板,我可以做到这一点没有任何问题。 但是,如果我尝试连接到两块板,则在建立连接或通信期间连接会超时。

这是我的代码:

主文件

from board import Board

b1 = Board(1, "192.168.0.254", 5)
b2 = Board(2, "192.168.0.77", 7)

b1.establish_connection()
b2.establish_connection()

while True:
    pass

板子.py

import threading
import socket
import random
import time
import select

class Board():
    def __init__(self, nr, host_address, port_nr):
        self.server_addr = (host_address, port_nr)
        self.nr = nr
        self.dt = 10


    def establish_connection(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.settimeout(5)
        print("Trying to establish a connection board {}".format(self.nr), self.server_addr)
        try:
            self.s.connect(self.server_addr)
            threading.Thread(target = self.communication).start()
            print("Connection established board {}".format(self.nr))
            return True
        except socket.timeout:
            print("Not connected. Connetion timeout.")
            return False
        except socket.error as e:
            print("Not connected. " + str(e) + ".")
            return False


    def communication(self):
        while True:
            self.send_data([random.randint(0,500), random.randint(0,500), random.randint(0,500)])
            start_time = time.time()
            while (start_time + self.dt) >= time.time():
                data = self.receive_data()
                if data is not None:
                    print(data)
                    break

    def send_data(self, a):
        x, y, z = a[0], a[1], a[2]
        msg = "S,X%i,Y%i,Z%i,E" %(x,y,z)
        print("Sending msg {0}".format(msg))
        nsent = self.s.send(msg.encode('utf-8'))

    def receive_data(self):
        readable_s, _, _ = select.select([self.s], [], [], 0.001)
        if readable_s:
            msg = self.s.recv(20).decode('utf-8')
            return msg

当我使用 Hercules 而不是 python 脚本时,我也遇到了同样的问题。 图中可以看到两个开发板都可以连接,但是收到数据后没有回“OK”。 图片

问题不在于 python 代码,而在于板子指定了网关。 在上传到开发板上的 C 代码中将网关改回 0.0.0.0 后,同步通信开始工作。 此外,每块板必须有不同的 MAC 地址。

暂无
暂无

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

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