Python:2つのソケット、AからBへ、BからAへ

私は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
4

1 答え

あなたの正確なコードを使用し、それは私のために働いた。あなたが間違っているかもしれないと思うのは、間違ったIPへのtelnet接続です。 'localhost'または127.0.0.1を使用しないで、ボックスの実際の(内部の)IPを使用する必要があります。

linuxの場合は、 ifconfig -a 、または ipconfig/all をWindows上に表示できます。

あなたのコードを正確に実行し、修正はしません(上の2つの未知のインポートを削除することを除いて):

スクリプトの起動:

[ 15:01 [email protected] ~/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 
    time.sleep(1)
KeyboardInterrupt

その後telnet'd:

[ 15:01 [email protected] ~ ]$ 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 [email protected] ~ ]$ 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 [email protected] ~ ]$

私の内部インターフェイスの設定( inet addr:10.10.1.11 ):

[ 15:07 [email protected] ~/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
          ...
2
追加された
私が間違っているものでなければならない:/
追加された 著者 Lucas Kauffman,
私はインタフェースBで表示されるために入力したものを取得することはできません。私は1回の入力でウィンドウにテストを入力しますが、私の2番目の画面では何も出力しません
追加された 著者 Lucas Kauffman,
それを見つけた、私はループから受け入れを得る必要があった
追加された 著者 Lucas Kauffman,
一番上に置いて
追加された 著者 Lucas Kauffman,
タイは非常に! :)
追加された 著者 Lucas Kauffman,
ソケットは通常、eth ifaceにバインドされた実際のIP経由で接続するときにのみ動作するため、@ localhostを使わないようにします。
追加された 著者 chown,
while(true):これを while(true):time.sleep(0.25)に変更して、CPUが激しく溶けたハードウェアに爆発しないようにします。
追加された 著者 chown,
@ルーカス私が数分間で仕事をすると、私は例を掲示します。
追加された 著者 chown,
あ、いいね!あなたがうまく働いてうれしい。
追加された 著者 chown,
@ LucasKauffman良い質問btw。盗むつもりだ、私はこのコード= Dを使うことを意味する。
追加された 著者 chown,