Python: 2 сокета, отправка из А в Б и из Б в А - PullRequest
4 голосов
/ 25 ноября 2011

Я работаю над этим 2 дня, и все же мне не удается заставить его работать должным образом.

Я хотел написать приложение, которое использует 2 сокета с носителем посередине

Этот носитель - это скрипт, который должен читать из socketA и записывать в SocketB, читать из SocketB и писать в SocketA,

Однако, похоже, я не могу это прибить.

Мой скрипт во время работы принимает соединения, но он не позволяет мне что-то вводить на экране telnet.

Я использую 2 общих списка между сокетами для передачи данных.

    #!/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 голосов
/ 25 ноября 2011

Использовал ваш точный код, и он работал для меня.Я думаю, что вы, возможно, делаете неправильно, telnet'ing на неправильный IP.Не используйте 'localhost' или 127.0.0.1, вам нужно использовать фактический (внутренний) IP вашего ящика.

Если вы используете Linux, вы можете увидеть, если с ifconfig -a или ipconfig /all на Windows.

Точный запуск вашего кода, без изменений (за исключением удаления 2 неизвестных импортов сверху):

Запущенный скрипт:

[ 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

Затем telnet'd:

[ 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
          ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...