11.網絡編程:socket、服務端、客戶端
阿新 • • 發佈:2018-02-08
adding 編程 技術分享 。。 blog tom bre sta 分享 socket又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。 python中使用socket來進行網絡連接傳輸
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) #監聽 print("開始等待") while True: conn, addr= server.accept() print(conn, addr) print("客戶端連接") while True: data = conn.recv(1024) print("recv:",data) if not data: print("連接斷開...") break conn.send(data) 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()
11.網絡編程:socket、服務端、客戶端