2017-05-26 77 views
1

下面的代碼是一個簡單的聊天客戶端。我用netcat -l 8000啓動本地tcp服務器,然後通過運行下面的腳本與它連接。首先取決於我是否startt1t2。我可以從服務器讀取或不讀取。我還注意到,在打印語句中,我似乎從使用sys.readline和輸入函數的終端讀取空信息。爲什麼python輸入函數返回空字符串而不是等待用戶輸入?

我也試過用線程代替進程,結果是一樣的。

編輯:根據@ paulsm4給出的迴應,我用ncat代替netcat作爲我的服務器。這導致了一些瘋狂的事情發生。如果我使用ncat -k -l -m 100 8000而不是netcat/nc並用Thread替換Process。代碼正常工作。但是當我使用Process時,代碼崩潰了。

import sys 
import socket 
from multiprocessing import Process 
from time import sleep 


def connect(host, port): 
    s = socket.socket() 
    s.connect((host, port)) 
    return s 

def send_message(host, port): 
    s = connect(host, port) 
    while True: 
     sleep(1) 
     message = None 
     try: 
      message = input('> ') 
     except EOFError: 
      print("try failed") 
      pass 
     print('message is ', message) 
     if message: 
      val = s.send(message.encode('utf8')) 
      print('message sent') 


def receive(host, port): 
    s = connect(host, port) 
    while True: 
     sleep(1) 
     message = s.recv(1024).decode('utf8') 
     print('\n', message) 


def main(host, port): 
    t1 = Process(target=send_message, args=(host, port)) 
    t2 = Process(target=receive, args=(host, port)) 
    t1.start() 
    t2.start() 
    t1.join() 
    t2.join() 


if __name__ == '__main__': 
    host, port = sys.argv[1], int(sys.argv[2]) 
    main(host, port) 

回答

1

https://docs.python.org/2/howto/sockets.html

當的recv返回0字節,這意味着另一側已經關閉(或處於關閉過程 )的連接。您無法在此連接上收到任何 更多數據。永遠。您可能能夠成功發送數據 ;稍後我會再談這個。

換句話說,您需要確保您的「服務器」已啓動,並且準備好接受您的客戶端嘗試與其通話的連接之前(和之後)的連接。

上面的鏈接有一個很好的示例程序。下面是另一個:

Python socket – network programming tutorial

+0

啊是的!愚蠢的問題。 netcat和nc默認只監聽一個連接。感謝您指點我正確的方向! –

0

您應該添加s.bind((host,port))連接指定插口的IP和端口,s.listen(1)所以對於進入的數據包服務器等待最後conn, addr = s.accept(),以建立新的連接。在客戶端,您可以添加s.connect((host,port))將客戶端連接到服務器。

相關問題