2015-10-20 137 views
0

我有一个python聊天程序server.py和client.py。它适用于我的本地系统,但是当我尝试连接到远程主机,如koding.com ubuntu-vm或cloud9 ubuntu-vm时,它不起作用。Python Socket聊天程序在远程系统中不起作用

我无法通过网络访问远程客户端。

这个link暗示了我的一些问题。

我的目标是利用互联网不是局域网

下面是聊天server.py

import socket 
import thread 

HOST = ''    
PORT = 4444      
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 

while True: 
    s.listen(1) 
    conn, addr = s.accept() 
    print 'Connected by', addr 
while 1: 
    data = conn.recv(1024) 
    if data[:4] == "exit": 
     print 'Parted by', addr 
    else: 
     conn.send(data), 
    if not data: 
     break 
    print data 
conn.close 

下面是聊天client.py聊天

import socket 
getHOST = (raw_input('Enter the Host: ')) 
print getHOST 
HOST = getHOST 
PORT = 4444   
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 

NICK = raw_input('Welcome, Enter your name: ') 

while True: 
    MSG = raw_input('>> ') 
    MSG = NICK + ': ' + MSG 
    if MSG[5:] == "exit": 
    break 
    s.send(MSG) 
    data = s.recv(1024) 
print data 
s.close() 
+1

*不起作用*没用!请给出确切的错误,而不是让别人猜测2015年可能发生了什么 –

+0

,我建议你使用Python 3 :) –

+0

如果你的应用程序在本地工作,但不能从远程系统工作,那么你很可能需要打开对4444端口的访问看起来cloud9正在Google云上运行,所以你可能在那里运气不好(他们只支持一些特定的服务)。 Koding虚拟机托管在AWS上,他们声称所有的端口都是打开的。也许你的本地网络在4444端口有问题? –

回答

4

server.py不应该甚至在本地工作,因为它包含错误。

  • 你必须处理在一个单独的线程每个传入套接字连接。
  • 您只能拨打s.listen(1)一次,而不是无限循环。

我建议你改变你的server.py如下:

import socket 
import thread 

def handleChat(conn, addr): 
    print 'Connected by', addr 

    while 1: 
     data = conn.recv(1024) 
     if data[:4] == "exit": 
      print 'Parted by', addr 
     else: 
      conn.send(data), 
     if not data: 
      break 
     print data 
    conn.close 


def main(): 
    HOST = ''  
    PORT = 4444 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((HOST, PORT)) 
    s.listen(1) 

    while True: 
     conn, addr = s.accept() 
     thread.start_new_thread(handleChat, (conn, addr,)) 


if __name__ == "__main__": 
    main() 

然后把它放在你的服务器上,说example.com,并运行它。它应该现在工作,就像我测试过的那样。