python socket使用

自學python,先在菜鳥教程網自學,然後買了本書看。又從同事那裏淘到了某個培訓學校python教學視頻,查缺補漏。視頻是用python3.0講的,講解的很不錯,中間有讓寫作業,這個我很喜歡。這幾天看的是socket。書中和網站上講的很籠統,教學視頻寫了一個用例,講解的很不錯,然後自己就寫了幾遍,發現很多問題,總結一下。

先說下我的問題。

問題一:

  第一次寫的時候,知道步驟,但就是寫不出來。

  總結:在看視頻的時候,覺得很簡單,會了,就沒自己寫一遍,直到自己寫的時候才發發現自己不會,典型的眼高手低。

問題二:

  然後就是對着菜鳥教程的例子,寫了一遍,報錯,看了下報錯日誌,我首先想的不是我爲什麼錯了,而是趕緊對照人家網站例子,看是不是我哪裏寫不一樣,從來沒有懷疑過是網站的代碼本身有問題,後來證明確實是網站代碼有問題,是沒有encode造成的。

  總結:錯了就看日誌報錯的原因,順着原因去解決,很輕鬆,權威有時候也會打盹啊。

問題三:

  然後寫視頻中的例子,這個還是有點難度的,寫第一遍的時候,感覺亂七八糟的。一開始寫的時候,還很順利,結果後面問題不斷,然後問題多的就寫不下去了,就對着例子寫。成功後就刪了重寫第二遍,清晰了很多。過了一週,我寫第三遍,我把我當成講師,在講解這個例子。然後問題來了。我客戶端發送查詢命令,服務端返回數據,結果是第一次什麼也不返回,第二次輸出第一次的數據。我在服務端各種打輸出,確定服務端沒問題,那問題就出在客戶端了。細看了一遍,也沒問題啊。然後對比客戶端與服務端接受發送條令,發現服務端有兩個輸出,而客戶端只有一個接受數據指令。客戶端第一個接收指令接受的是長度,第二個接受的是數據。一開始我以爲客戶端的接收指令接收的就是數據,其實是長度,只是我當時腦子軸了,以爲那個長度就是數據,一直找了一兩個小時才發現。當時真想給自己兩巴掌。注意一下,這裏的兩個接收指令不能寫反,是與服務端按順序接收數據的。

  總結:把別人的例子,自己吃透了,纔是自己,純粹的抄寫是不行,只有自己融會貫通才行。

問題四:客戶端close(),在pycharm,提示:This inspection detects code which can not be normally reached,即:此行代碼運行的時候無法達到。後來經過研究,發現是因爲While True 這個循環沒有結束,只要進行判斷,進行一個break就行了。

  先上圖一張,網上搜的,講解的很明確,所以粘貼上來,讓大家看看

代碼部分:

server端:

import socket  ,os
server = socket.socket()
# host = socket.gethostname()
# client.connect(('localhost',9999))
server.bind(('localhost',9999))
server.listen(2)
while True:
print('等待客戶端連接。。。。')
recip,addr = server.accept()
while True:
print('\033[1;34;0m地址是\033[0m',addr)
data = recip.recv(1024)
if not data:
print('\033[1;38;0m客戶端 has lost...\033[0m')
break
msg_res = os.popen(data.decode('utf-8')).read()
print('\033[1;32;0m發送到客戶端的內容爲:\n\033[0m',msg_res)
recip.send(str(len(msg_res)).encode())
recip.send(msg_res.encode())
print('\033[1;33;0m發送到客戶端的內容爲:\n\033[0m', msg_res.encode())
print('\033[1;35;0m發送數據的長度:\033[0m',len(msg_res))
server.close()
print('server 運行結束!')

client端:


from socket import *
import asyncio

client_socket = socket()
host = gethostname()
client_socket.connect(('localhost',9998))

while True:
cmd = input('輸入你要查詢的內容:').strip()
client_socket.send(cmd.encode("utf-8"))
if len(cmd) == 0:continue
#接受數據的順序不能寫反
data_len = client_socket.recv(1024)
receive_size_len = int(data_len.decode())
# client_socket.send('200 ok'.encode())
receive_data = b''
receive_len = 0
#方法一
while receive_len < receive_size_len:
#這裏加if判斷語句的話,在客戶端可以取消註釋的一行:client_socket.send('200 ok'.encode())
if receive_size_len - receive_len > 1024:
size = 1024
else:
size = receive_size_len - receive_len

data = client_socket.recv(size)
receive_len += len(data.decode())
receive_data += data
print('\033[1;35;01m輸出數據爲:\n\033[0m',receive_data.decode())

else:
print("\033[1;36;01mcmd res receive done...\033[0m")
break
client_socket.close()
print('\033[1;33;0mclient has over \033[0m'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章