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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM