2015-05-28 20 views
3

我試圖構建一個python客戶端來與我的C服務器進行交互。下面是客戶端的代碼:在shell和代碼文件中註明的python socket差異

import socket 
s = socket.socket() 
s.connect(("127.0.0.1", 12209)) 
print "preparing to send" 
s.send("2") 
s.send("mmm2.com") 
s.send("mypwd") 
s.send("5120") 
print "Sent data" 
root = s.recv(256) 
print root 

當我運行通過在線課程行交互式外殼(圖形用戶界面IDLE)這個代碼,一切運行非常精細。但是,當我將這段代碼保存在一個文件中,然後嘗試運行它時,它會掛起並根據窗口停止響應,那我只是沒有做什麼?

+0

它掛在哪裏? – larsks

+0

這不是真正的C相關。你如何「保存一個文件並嘗試運行它」? – Eregrith

+0

在掛起之前,它打印出「已發送數據」,所以我想它掛在s.recv()上,但服務器沒有收到任何東西 – Kimutai

回答

2

如果您逐行輸入,發送的字符串很可能會在單獨的recv()調用中被服務器接連接收。

當你在一個腳本中執行它時,所有的send()調用都會​​立即運行,並且服務器可能會在一次recv()調用中接收到一個批量中的所有數據。所以服務器會看到「2mmm2.commypwd5120」,並且可能無法正確處理。它可能會等待來自客戶端的更多輸入。

您需要在值之間進行一些明確的分隔,例如換行符,以便服務器可以正確解析接收到的數據。

+0

關於時間睡眠功能,它可以工作嗎? FYI服務器在C – Kimutai

+0

@BryanKim:它有時可能會工作,但它絕對不可靠。沒有保證睡眠可以做任何有用的事情,或者手動輸入的代碼將始終有效。這只是一個運氣問題。使用換行符或類似的分隔符肯定更可靠。 – sth

+0

那麼你會對我的客戶做什麼修改?因爲我不太清楚如何按照你的建議合併換行符 – Kimutai