Python:2个套接字,从A发送到B,再从B发送到A

4 投票
1 回答
1113 浏览
提问于 2025-04-17 07:01

我已经花了两天时间在这个问题上,但还是没能让它正常工作。

我想写一个应用程序,使用两个套接字,中间有一个介质。

这个介质就是一个脚本,它应该从socketA读取数据,然后写入socketB,同时也从socketB读取数据,再写回socketA。

不过,看起来我就是搞不定这个。

我的脚本在运行时可以接受连接,但我在telnet屏幕上却无法输入任何东西。

我在两个套接字之间使用了两个共享列表来传递数据。

    #!/usr/bin/env python
    import sys
    import arduinoReadThread
    import arduinoWriteThread
    import socket
    import thread



    bolt = 0
    socketArray=list()
    HOST =""
    HOST2=""
    PORT1 =50115
    PORT2 =50125



    s1=socket.socket(socket.AF_INET, socket.SOCK_STREAM ) #create an INET, STREAMing socket
    s1.bind((HOST,PORT1)) #bind to that port
    s1.listen(2) #listen for user input and accept 1 connection at a time.
    socketArray.append(s1)
    s2=socket.socket(socket.AF_INET, socket.SOCK_STREAM ) #create an INET, STREAMing socket
    s2.bind((HOST2,PORT2)) #bind to that port
    s2.listen(2) #listen for user input and accept 1 connection at a time.
    socketArray.append(s2)
    print "sockets set up"

    s1ToWriteList = list()


    s2ToWriteList = list()


    def socketFunctionWrite1():
            while(bolt == 0):
                client, address = s1.accept()

                print "Writing connections"
                if len(s1ToWriteList) > 0:
                    client.send(s1ToWriteList.pop(0))


    def socketFunctionRead1():
            while(bolt == 0):
                client2, address = s2.accept()

                f = client2.recv(1024)

                print "reading connection"
                s1ToWriteList.append(f)
                print len(s1ToWriteList)

    def socketFunctionWrite2():
            while(bolt == 0):
                client2, address = s2.accept()
                print "Writing connections"
                if len(s2ToWriteList) > 0:
                    client2.send(s2ToWriteList.pop(0))



    def socketFunctionRead2():
            while(bolt == 0):
                client, address = s1.accept()
                f = client.recv(1024)
            print "reading connection"
            s2ToWriteList.append(f)
            print len(s2ToWriteList)




def shutDown():
        test = raw_input("Quit ?")
        if(test =="y"):
            bolt = 1
        else:
            shutDown()

def spreadSockets():


        thread.start_new_thread(socketFunctionRead1,())
        print "launch 1"
        thread.start_new_thread(socketFunctionRead2,())
        print "launch 2"
        thread.start_new_thread(socketFunctionWrite1,())
        print "launch 3"
        thread.start_new_thread(socketFunctionWrite2,())

        print "launch 4"




spreadSockets()
while(True):
        pass

1 个回答

2

我用了你完全一样的代码,结果成功了。我觉得你可能犯的错误是连接到了错误的IP地址。不要用'localhost'或者127.0.0.1,你需要用你电脑的实际(内部)IP地址。

如果你在用Linux,可以通过输入 ifconfig -a 来查看,Windows上则可以用 ipconfig /all

我完全按照你的代码运行,没有做任何修改(只是去掉了顶部的两个不明导入):

启动脚本:

[ 15:01 jon@hozbox.com ~/SO/python ]$ ./sock.py
sockets set up
launch 1
launch 2
launch 3
launch 4
Writing connections
Writing connections
^CTraceback (most recent call last):
  File "./sock.py", line 93, in <module>
    time.sleep(1)
KeyboardInterrupt

然后连接:

[ 15:01 jon@hozbox.com ~ ]$ telnet 10.10.1.11 50115
Trying 10.10.1.11...
Connected to 10.10.1.11.
Escape character is '^]'.
Hello, World!
Hello 2
^]
telnet> quit
Connection closed.
[ 15:02 jon@hozbox.com ~ ]$ telnet 10.10.1.11 50125
Trying 10.10.1.11...
Connected to 10.10.1.11.
Escape character is '^]'.
Hello 50125!
Hi!
^]
telnet> quit
Connection closed.
[ 15:02 jon@hozbox.com ~ ]$

我的内部接口配置是 (inet addr:10.10.1.11):

[ 15:07 jon@hozbox.com ~/SO/python ]$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr **:**:**:**:**:**
          inet addr:10.10.1.11  Bcast:10.10.1.255  Mask:255.255.255.0
          ...

撰写回答