2011-11-24 105 views
4

我一直在为此工作2天,但仍然无法使其正常工作。Python:2个套接字,从A发送到B,从B发送到A

我想写一个使用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 

回答

2

使用您的确切代码,它为我工作。我认为你可能做错了是通过telnet到错误的IP。不要使用'localhost'或127.0.0.1,你需要使用你的盒子的实际(内部)IP。

如果在linux上,你可以看到是否在ifconfig -aipconfig /all上的窗口。

运行你的代码完全,无修改(除了移除顶部的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 <module> 
    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 jon[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 
      ... 
+0

必须是我做错了,然后:/ –

+0

@L请务必不要使用本地主机,因为套接字通常只有当你通过一个真正的IP连接到他们的eth eth连接到它们。 – chown

+0

另外,改变:while(True):pass' this:'while(True):time.sleep(0.25)'这样你的cpu不会爆炸成火热的熔化硬件。 – chown

相关问题