2015-10-20 5 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,並運行它。它應該現在工作,就像我測試過的那樣。