簡體   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