標籤:ip地址 wait pytho bind 基本 上下文 most shutdown send
1、socket定義:為上層軟體提供TCP/IP通訊的軟體模組
socket模組工作流程,伺服器端啟動socket,accept,即自身建立一個串連執行個體維護串連狀態,擷取一個用戶端串連執行個體,等待串連。用戶端調用socket,進行串連connect即建立一個串連執行個體。
2、在本地類比用戶端串連過程,見下例。
首先遇到常見錯誤
import socketserversock = socket.socket() #serversock.bind((‘192.168.148.212‘,9999,))#注意這裡的連接埠需要intserversock.bind((‘127.0.0.0‘,9999,))serversock.listen(3)#啟動監聽排隊coninstance,ipadd = serversock.accept()print (ipadd,‘o---o‘,coninstance) >>> RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python35-32/sersock.py Traceback (most recent call last): File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35-32/sersock.py", line 7, in <module> serversock.bind((‘127.0.0.0‘,9999,))OSError: [WinError 10049] 在其上下文中,該請求的地址無效。
-*-* OSError: [WinError 10049] 在其上下文中,該請求的地址無效。
實際是由於IP地址寫的不正確導致,那麼如何查看IP和開放的連接埠呢?
a)ipconfig /all 查看本機IP地址
b) netstat -an 查看開放的IP連接埠
若果使用127.0.0.1 連接埠 5037 可能看到這樣的錯誤
-*-* OSError: [WinError 10048] 通常每個通訊端地址(協議/網路地址/連接埠)只允許使用一次。
這可能是由於這個連接埠已經被佔用導致,更換一個不常用的port,9999,不再提示此類錯誤。
-*-* ConnectionRefusedError: [WinError 10061] 由於目標電腦積極拒絕,無法串連。
當使用ftp測試時,關閉ftp使用命令quit。因為一旦開啟ftp 使用工作管理員或是直接關閉cmd,都是不生效的。
a)檢查window 的server是否開啟。未開啟將其開啟。右鍵我的電腦 - 管理 - 服務 - server
b) 檢查window的telnet服務是否開啟(socket模組 基於tcp協議),未開啟將其開啟,控制台-程式-開啟或關閉window功能-telnet用戶端和服務端
問題根因不明確 規避辦法 使用python27 問題軟體 python 3.5.1
python的2.7解譯器可能也有問題只能正常執行一次client,當第二次執行時會報10061。[WinError 10061] 由於目標電腦積極拒絕,無法串連。
想看出用戶端和服務端串連的效果可以分別在兩個CMD命令視窗中執行server代碼和client代碼。
server代碼
import socketserver = socket.socket() server.bind((‘127.0.0.1‘,9000))server.listen(5)print (‘wait ...‘)while True: conn,address= server.accept() print (address,‘o---o‘,conn)
client 代碼
import socketimport timecli = socket.socket() print (cli) cli.connect((‘127.0.0.1‘,9000))print (‘2‘)time.sleep(1)#cli.close()
3、類比網路聊天時報錯,排查:1 對迴圈進行排查,正常 2 將sendall()中字串加str()處理,仍然顯示錯誤。
注意:recv和服務端的accept都是等待輸入,即如果對端無輸入,將一直等待。而且當recv處於迴圈中時,break迴圈,recv為收到輸入,迴圈終止,則recv會報錯。
socket.error: [Errno 10053]
基本確定是在server端,server.recv(1024)處錯誤
-*-*[Errno 10057] 由於通訊端沒有串連並且(當使用一個 sendto 調用發送數
server端
import socketimport sysimport timeserver = socket.socket() server.bind((‘127.0.0.1‘,9000))server.listen(5)print (‘wait ...‘)while True: conint,address= server.accept() conint.sendall(‘hello,welcome‘) print (address,‘o---o‘,conint) while True: #serrecv = server.recv(1024) ‘‘‘if serrecv == ‘remote shutdown‘: sys.exit(0) else: server.sendall(serrecv+‘good‘)‘‘‘ time.sleep(2) server.sendall(str(server.recv(1024)+‘good‘))
client端
import socketimport timecli = socket.socket() print (cli) cli.connect((‘127.0.0.1‘,9000))print (‘2‘)sercon = cli.recv(1024)print serconwhile True: time.sleep(1) inp = raw_input(‘pleaes input:‘) if inp != ‘quit‘: cli.sendall(str(inp)) print cli.recv(1024) else: breakcli.close()
錯誤原因:server.sendall(str(server.recv(1024)+‘good‘))
這裡應該使用server.accept()建立的與用戶端串連執行個體 作為對象,即conint,進行conint.recv()。
python socket模組