2016-09-16 221 views
0

我試圖在提示從鍵盤輸入中輸入文本後發送數據。該代碼似乎工作,但沒有出現提示。有人可以建議爲什麼嗎?通過套接字發送和接收數據python3

代碼發送的是:

#!/usr/bin/python3 
    import socket 
    class LogSocket: 
    def __init__(self, socket): 
     self.socket = socket 

    def send(self, data): 
     print("Sending {0} to {1}".format(data, self.socket.getpeername()[0])) 
     self.socket.send(data) 

    def close(self): 
     self.socket.close() 

    def respond(client): 
    response = input("Enter a value: ") 
    client.send(bytes(response, 'utf8')) 
    client.close() 

    if __name__ == "__main__": 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind(('localhost',2401)) 
    server.listen(1) 
    try: 
     while True: 
     client, addr = server.accept() 
     respond(LogSocket(client)) 
    finally: 
     server.close() 

代碼,以接收爲:

#!/usr/bin/python3 
import socket 
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client.connect(('localhost', 2401)) 
print("Received: {0}".format(client.recv(1024))) 
client.close() 

的行爲是有點怪。當我在發送終端輸入「Hello World」然後進入時,當我切換到接收終端並運行接收腳本時,沒有輸出。當我再次輸入「Hello World」,然後按下發件人中的回車鍵,然後重新運行接收腳本並顯示「Hello World」,但是輸入提示!

發件人輸出:

Hello World 
Enter a value: Sending b'' to 127.0.0.1 
Hello World 
Enter a value: Sending b'Hello World' to 127.0.0.1 

接收機輸出:

$ ./receive_data_socket1.py 
Received: b'' 
$ ./receive_data_socket1.py 
Received: b'Hello World' 

可能有人在用插座在Python3打交道的經驗解釋的行爲?我知道,在3.5中,這種行爲已經發生了變化,這正是我所使用的。

回答

0

當您運行服務器時,它會阻止server.accept()呼叫,直到客戶端連接。即直到客戶端連接,它不會執行下一行代碼。它只在下一行,即respond(...)函數中觸發輸入提示。

試試這個

  1. 啓動服務器在一個選項卡
  2. 啓動客戶端的另一個選項卡
  3. 返回到服務器 - 你應該會看到一個提示,現在

你」其他選項是在accept之前運行輸入提示,並將其存儲在變量中。然後用這個變量調用respond - 這是一個片段

#!/usr/bin/python3 
import socket 
class LogSocket: 
    def __init__(self, socket): 
     self.socket = socket 

    def send(self, data): 
     print("Sending {0} to {1}".format(data, self.socket.getpeername()[0])) 
     self.socket.send(data) 

    def close(self): 
     self.socket.close() 

def respond(client, response): 
    client.send(bytes(response, 'utf8')) 
    client.close() 

if __name__ == "__main__": 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind(('localhost',2401)) 
    server.listen(1) 
    try: 
     while True: 
      response = input("Enter a value: ") 
      client, addr = server.accept() 
      respond(LogSocket(client), response) 
    finally: 
     server.close() 
相關問題