2017-02-04 41 views
1

我練一點點與蟒蛇構建一個套接字服務器比較投入。我目前在我的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」時關閉套接字。

+1

的B」是因爲插座生產字節,不是字符串。另外,請嘗試使用nc而不是telnet來避免必須處理telnet協議添加的其他字節。 –

+0

好的,但我從套接字recv方法返回一個字符串?我怎樣才能讓句子只是輸入字符串,所以我可以將它與「hello」進行比較? – Peter

+0

謝謝你,我會嘗試,現在 – Peter

回答

1

使用的netcat代替遠程登錄,以避免telnet協議字節。 像這樣:nc localhost 20000然後輸入你的輸入。

另外,插座I/O始終是字節在Python 3,如見https://docs.python.org/3/library/socket.html#socket.socket.recv所以,你必須用b'hello'比較(或第一字節解碼爲一個字符串)

+0

謝謝,但它仍然無法正常工作。我現在使用nc,並將每次發生connectionSocket.recv(1024)變爲str(connectionSocket.recv(1024),'utf-8')。服務器現在獲得了正確的字符串,但它仍然不會回顯「hello」給我,也不會在我輸入「bye」時停止。 – Peter

+1

你有沒有調試過它?或者在sock.recv()後面的行上放置一個斷點,或者打印您在那裏收到的內容。你會看到(如果你通過netcat使用手動輸入!)收到的字節將是'''hello \ n''',它仍然包含你將在netcat控制檯輸入的換行符。如果你使用''sock.makefile()''並且從它讀取東西,就好像它是一個普通文件一樣,也許對你更容易?而不是處理原始recv電話 –

+0

謝謝!我解決了它!我接受了你的答案。如果你能提高問題的話,我會非常感激:) – Peter

相關問題