Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一个插座传递到另一个插座_Python_Multithreading - Fatal编程技术网

Python 从一个插座传递到另一个插座

Python 从一个插座传递到另一个插座,python,multithreading,Python,Multithreading,我正试图写一个程序,作为一个媒介工作。(M) 我只能使用telnet连接: A需要连接到M,B连接到M A通过套接字向M发送数据,M需要将数据传递给B B通过另一个套接字向M发送数据 我试着用一个共享列表启动四个线程 问题是它似乎没有向另一个套接字写入,甚至没有接受写入 有人知道更好的方法来实现它并将它传递到另一个套接字吗 我的代码: import sys import arduinoReadThread import arduinoWriteThread import socket class

我正试图写一个程序,作为一个媒介工作。(M)

我只能使用telnet连接:

A需要连接到M,B连接到M

A通过套接字向M发送数据,M需要将数据传递给B

B通过另一个套接字向M发送数据

我试着用一个共享列表启动四个线程

问题是它似乎没有向另一个套接字写入,甚至没有接受写入

有人知道更好的方法来实现它并将它传递到另一个套接字吗

我的代码:

import sys
import arduinoReadThread
import arduinoWriteThread
import socket
class ControllerClass(object):
    '''
    classdocs
    '''
    bolt = 0
    socketArray=list()

    def __init__(self):
        self.readAndParseArgv()
        self.createThreads()

    def readAndParseArgv(self):
        array = sys.argv
        print sys.argv
        if len(array) != 3:
            print "Too few arguments : ./script host:port host:port"
        else:
            for line in array:
                if ":" in line:
                    splitted = line.split(':')
                    HOST = splitted[0]
                    print HOST
                    PORT = int(splitted[1])
                    print PORT
                    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM ) #create an INET, STREAMing socket
                    s.bind((HOST,PORT)) #bind to that port
                    print "test"
                    s.listen(1) #listen for user input and accept 1 connection at a time.
                    self.socketArray.append(s)

    def createThreads(self):
        print "Creating Threads"
        sharedArray1 = list()
        sharedArray2 = list()
        s1 = self.socketArray.pop()
        s2 = self.socketArray.pop()
        sT1 = arduinoWriteThread.writeThread().run(self.bolt,sharedArray1,s2)
        sT2 = arduinoReadThread.readThread().run(self.bolt,sharedArray1,s1)
        sT3 = arduinoReadThread.readThread().run(self.bolt,sharedArray2,s2)
        sT4 = arduinoWriteThread.writeThread().run(self.bolt,sharedArray2,s1)
        sT1.start()
        sT2.start()
        sT3.start()
        sT4.start()
x = ControllerClass()
x
两个线程: 写入线程:

导入线程 类writeThread(threading.Thread):

读线程

import threading
    class readThread ( threading.Thread ):

    def run ( self,bolt,writeList,socketToReadFrom ):
        s = socketToReadFrom
        while(bolt == 0):
            conn, addr = s.accept()

            f = conn.rcv()
            print f
            writeList.append(f)

你真的不需要线程来完成这个

接受新连接后,将其添加到列表中。从列表中的某个连接接收任何内容时,请发送到所有连接,但从中获取消息的连接除外

用于查看哪些连接已向您发送数据

编辑 使用select的示例:

# serversocket: One server socket listening on some port, has to be non-blocking
# all_sockets : List containing all connected client sockets
while True:
    readset = [serversocket]
    readset += all_sockets

    # Wait for sockets to be ready, with a 0.1 second timeout
    read_ready = select.select(readset, None, None, 0.1)

    # If the listening socket can be read, it means it has a new connection
    if serversocket in read_ready:
        new_connection = serversocket.accept()
        new_connection.setblocking(0);  # Make socket non-blocking
        all_sockets += [new_connection]
        read_ready.remove(serversocket) # To not loop over it below

    for socket in read_ready:
        # Read data from socket
        data = socket.recv(2048)
        for s in all_sockets:
            # Do not send to self
            if s != socket:
                s.send(data)

免责声明我从来没有真正使用过Python套接字函数,上面的代码是刚刚阅读手册页面编写的。代码可能不是最优的,或者也不是很符合Python。

我听说过select,但我并不真正了解它是如何工作的,你能给我一个代码示例吗?
# serversocket: One server socket listening on some port, has to be non-blocking
# all_sockets : List containing all connected client sockets
while True:
    readset = [serversocket]
    readset += all_sockets

    # Wait for sockets to be ready, with a 0.1 second timeout
    read_ready = select.select(readset, None, None, 0.1)

    # If the listening socket can be read, it means it has a new connection
    if serversocket in read_ready:
        new_connection = serversocket.accept()
        new_connection.setblocking(0);  # Make socket non-blocking
        all_sockets += [new_connection]
        read_ready.remove(serversocket) # To not loop over it below

    for socket in read_ready:
        # Read data from socket
        data = socket.recv(2048)
        for s in all_sockets:
            # Do not send to self
            if s != socket:
                s.send(data)