socket: socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求。 python中使用socket來進行網路連接傳輸 由圖可知: socket中客戶端需要進行的操作是:建立,連接,傳輸數據 ,接收數據,關閉連接 服務端需要進行的操作是:建立,綁定IP地址和埠,等... ...
socket:
由圖可知:
socket中客戶端需要進行的操作是:建立,連接,傳輸數據 ,接收數據,關閉連接
服務端需要進行的操作是:建立,綁定IP地址和埠,等待連接,接收數據,傳輸數據 ,關閉連接
服務端:
- 建立:socket.socket()
- 綁定埠:bind(('IP地址',埠)),其中地址和埠號是一個 tuple
- 監聽:listen()
- 接受連接:accept(),返回值是一個連接實例和一個地址,地址是連接過來的客戶端地址,而數據操作要利用這個連接實例
- 傳輸數據:send(),傳輸的數據必須是位元組流,所以對字元串數據需要使用encode()
- 接收數據read:recv(x),傳輸的數據必須是位元組流,x是接收的位元組數,如果需要轉成Unicode,需要使用decode()
- 關閉連接close:close()
import socket server=socket.socket()#建立socket server.bind(('localhost',1234))#綁定 server.listen()#監聽 print("開始等待。。。") conn,addr=server.accept()#接收連接 print("連接成功") data=conn.recv(1024)#接收數據 print(data.decode()) conn.send(data)#發送數據 server.close()#關閉連接 print("--------------------")
- 上述代碼存在一個問題:只能接受一次連接,連接結束後,服務端socket將關閉,更改成不立即關閉能等待下一個連接的:
#伺服器端 import socket server = socket.socket() server.bind(('localhost',1234)) #綁定ip和埠 server.listen(5) #監聽 while True: print("開始等待") conn, addr = server.accept() print(conn, addr) print("客戶端連接") while True: data = conn.recv(1024) print("recv:",data) if not data: #當data=0時為真 print("連接斷開...") break conn.send(data) server.close()
註:上述代碼中在linux中正常運行,在windows中會報錯!
如果要在windows中運行,需要捕獲異常:
#伺服器端 import socket server = socket.socket() server.bind(('localhost',1234)) #綁定ip和埠 server.listen(5) #監聽 while True: print("開始等待") conn, addr = server.accept() print(conn, addr) print("客戶端連接") while True: try: data = conn.recv(1024) print("recv:",data) if not data: #當data=0時為真 print("連接斷開...") break conn.send(data) except ConnectionResetError as e: print(e) break server.close()
客戶端:
- 建立:socket.socket()
- 連接:connect(('IP地址',埠)),其中地址和埠號是一個 tuple
- 傳輸數據:send(),傳輸的數據必須是位元組流,所以對字元串數據需要使用encode()
- 接收數據recv:recv(),傳輸的數據是位元組流,如果需要轉成Unicode,需要使用decode()
- 關閉連接close:close()
import socket client=socket.socket()#建立socket client.connect(('localhost',1234))#連接 client.send("你好".encode())#發送數據 data=client.recv(1024)#接收數據 print(data.decode()) client.close()#關閉連接
- 上述代碼存在一個問題:只能發送一次數據,發生完數據就會斷開連接,改成可以多次發送數據,不自動斷開的【前提是服務端能接收多次】:
import socket client=socket.socket() client.connect(('localhost',1234)) while True: cmd=input(">>") if len(cmd)==0: continue client.send(cmd.encode()) cmd_res=client.recv(1024) print(cmd_res.decode()) client.close()