我練一點點與蟒蛇構建一個套接字服務器比較投入。我目前在我的linux mint系統上本地運行它,並用telnet localhost 20000
進行測試。Python的socket服務器:無法從客戶端
這個想法很簡單。現在,我希望客戶端(我)發送一個「hello」消息給服務器,服務器在服務器上以另一個「hello」消息作爲迴應。然後客戶端可以發送服務器沒有響應的任何消息,直到客戶端說「再見」。然後服務器響應另一個「再見」,並關閉套接字。
我在下面的方式來實現這一點(在Python 3):
1 from socket import *
2 serverPort = 20000
3 serverSocket = socket(AF_INET, SOCK_STREAM)
4 serverSocket.bind(('', serverPort))
5 serverSocket.listen(1)
6
7 print('The echo server is ready to receive')
8 while 1:
9 connectionSocket, addr = serverSocket.accept()
10 print('Processing client ', addr)
11 sentence = ""
12
13 try:
14 sentence = connectionSocket.recv(1024)
15 while sentence != "hello":
16 sentence = connectionSocket.recv(1024)
17 connectionSocket.send("hello")
18
19 sentence = connectionSocket.recv(1024)
20 while sentence != "bye":
21 sentence = connectionSocket.recv(1024)
22 connectionSocket.send("bye")
23 except error:
24 pass
25
26 print('Client closed ', addr)
27 connectionSocket.close()
這是一個非常簡單的程序,我在其中找不到任何錯誤,所以我很驚訝地看到它行不通。當我與python3 server.py
運行的服務器,並在建立連接槽telnet localhost 20000
後輸入「你好」我根本得不到迴應。我首先想到的,問題在於在行號15的相等測試,所以我測試了一些東西,包括打印,和而不是「你好」的服務器接收到的消息是:b'hello \ r \ n。我瞭解\ n,因爲我在「hello」消息後鍵入了Enter,但我不清楚爲什麼會出現b'和\ r。
你知道問題是什麼在這裏,我怎麼能解決這個問題?在堆棧溢出的其他例子中,字符串比較工作正常,所以我不知道爲什麼它不適合我。
在此先感謝!
更新: 我用nc的現在,而不是telnet和改變connectionSocket.recv(1024)的每一次出現到STR(connectionSocket.recv(1024), 'UTF-8')。服務器現在獲得了正確的字符串,但它仍然不會回顯「hello」給我,也不會在鍵入「bye」時關閉套接字。
的B」是因爲插座生產字節,不是字符串。另外,請嘗試使用nc而不是telnet來避免必須處理telnet協議添加的其他字節。 –
好的,但我從套接字recv方法返回一個字符串?我怎樣才能讓句子只是輸入字符串,所以我可以將它與「hello」進行比較? – Peter
謝謝你,我會嘗試,現在 – Peter