2014-10-02 76 views
0

我有以下的python脚本(有点低效的,我知道)工作:Python的P2P Socket的聊天脚本使用套接字只对一个P2P聊天程序家庭网络(不是学校网络上)

#!usr/bin/env python 

import socket import threading import select import time import datetime 

def main(): 

    class Chat_Server(threading.Thread): 
      def __init__(self): 
       threading.Thread.__init__(self) 
       self.running = 1 
       self.conn = None 
       self.addr = None 
      def run(self): 
       HOST = '' 
       PORT = 23647 
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
       s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
       s.bind((HOST,PORT)) 
       s.listen(1) 
       self.conn, self.addr = s.accept() 
       # Select loop for listen 
       while self.running == True: 
        inputready,outputready,exceptready \ 
         = select.select ([self.conn],[self.conn],[]) 
        for input_item in inputready: 
         # Handle sockets 
         message = self.conn.recv(1024) 
         if message: 
          print "Daniel: " + message + ' (' + datetime.datetime.now().strftime('%H:%M:%S') + ')' 
         else: 
          break 
        time.sleep(0) 
      def kill(self): 
       self.running = 0 

    class Chat_Client(threading.Thread): 
      def __init__(self): 
       threading.Thread.__init__(self) 
       self.host = None 
       self.sock = None 
       self.running = 1 
      def run(self): 
       PORT = 23647 
       self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
       self.sock.connect((self.host, PORT)) 
       # Select loop for listen 
       while self.running == True: 
        inputready,outputready,exceptready \ 
         = select.select ([self.sock],[self.sock],[]) 
        for input_item in inputready: 
         # Handle sockets 
         message = self.sock.recv(1024) 
         if message: 
          print "Daniel: " + message + ' (' + datetime.datetime.now().strftime('%H:%M:%S') + ')' 
         else: 
          break 
        time.sleep(0) 
      def kill(self): 
       self.running = 0 

    class Text_Input(threading.Thread): 
      def __init__(self): 
       threading.Thread.__init__(self) 
       self.running = 1 
      def run(self): 
       while self.running == True: 
        text = raw_input('') 
        try: 
         chat_client.sock.sendall(text) 
        except: 
         Exception 
        try: 
         chat_server.conn.sendall(text) 
        except: 
         Exception 
        time.sleep(0) 
      def kill(self): 
       self.running = 0 

    # Prompt, object instantiation, and threads start here. 

    ip_addr = raw_input('Type IP address or press enter: ') 

    if ip_addr == '': 
     chat_server = Chat_Server() 
     chat_client = Chat_Client() 
     chat_server.start() 
     text_input = Text_Input() 
     text_input.start() 

    else: 
     chat_server = Chat_Server() 
     chat_client = Chat_Client() 
     chat_client.host = ip_addr 
     text_input = Text_Input() 
     chat_client.start() 
     text_input.start() 

if __name__ == "__main__": 
    main() 

这个脚本在家庭网络中工作得很好,拥有192.168 ...内部IP地址。

在学校网络上,有172个IP地址,它似乎不起作用。没有连接错误,但消息不会被发送或接收,除了在具有相同内部IP地址的同一台计算机上运行的应用程序有两个实例,在这种情况下该程序完美无缺。

我对套接字和这种网络非常陌生,所以我想知道是否有人可以指出为什么是这种情况。例如,可能是IP地址的差异?

预先感谢您。

回答

1

我看到您正在连接端口23647 - 您的学校网络上可能无法访问此端口。检查此端口是否启用流量。详情请参阅:Port Forwarding

类似于:this site/tool可能允许您快速检查。

+0

谢谢,但整个事情都在一个网络内部,所以它应该无关紧要,如果端口转发或不应该,或者它应该? – abcbabcba 2014-10-02 16:19:50

+0

我认为你可能是正确的 - 但是,它可能是你试图通信的端口明确被你的学校网络的防火墙阻止。至少值得一检查。 – 2014-10-02 16:29:17

+1

啊哈。我认为他们可能只允许某些端口(例如80),所以我会尝试使用它们。 – abcbabcba 2014-10-02 16:29:51