socket(簡稱套接字),是進程間通信的一個工具,他能實現把數據從一方傳輸到另外一方,完成不一樣電腦上進程之間的通信,它比如數據的搬運工。
socket應用:
不誇張來講,只要跟網絡相關的應用程序或者軟件都使用到了socket, 好比:微信,qq等
使用socket建立udp網絡程序的流程:
1,建立客戶端套接字
2,發送/接收數據
3,關閉套接字
使用程序展示流程 :(使用的 ide爲pycharm):
1,首先建立socket,在 Python 中 使用socket 模塊的函數 socket 就能夠完成:python
import socket
2,建立udp socket套接字
建立套接字格式 :udp_socket = socket(AddressFamily, Type)
其中AddressFamily表明IP地址類型,AF_INET表示ipv4類型、AF_INET6表示ipv6類型; Type:套接字類型,能夠是 SOCK_STREAM(流式套接字,主要用於 TCP 協議)或者 SOCK_DGRAM(數據報套接字,主要用於 UDP 協議)小程序
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
3,發送/接收套接字(接上方的步驟)
首先準備對方的 ip地址和 端口號
假設ip地址爲:192.168.1.103
端口號爲:8080微信
dest_addr = ('192.168.1.103',8080) #注意 是元組 ip地址爲字符串,端口號爲數字
從鍵盤獲取數據網絡
send_data = input('請輸入要輸入的數據 ')
發送數據到指定的電腦上socket
udp_socket = socket.sendto(send_data.encode('utf-8'),dest_addr) #sendto是udp用來發送數據的,在發送的過程當中咱們須要對發送的數據進行轉碼,轉換成utf-8
4,關閉套接字ide
udp_socket.close()
以上即是udp使用socket傳輸的一些基本步驟
整個發送/接受數據的小程序完整以下:函數
import socket # 1. 建立udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2. 準備接收方的地址 dest_addr = ('192.168.236.129', 8080) # 3. 從鍵盤獲取數據 send_data = input("請輸入要發送的數據:") # 4. 發送數據到指定的電腦上 udp_socket.sendto(send_data.encode('utf-8'), dest_addr) # 5. 等待接收對方發送的數據 recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字節數 # 6. 顯示對方發送的數據 # 接收到的數據recv_data是一個元組 # 第1個元素是對方發送的數據 # 第2個元素是對方的ip和端口 print(recv_data[0].decode('gbk')) print(recv_data[1]) # 7. 關閉套接字 udp_socket.close()
數據的編碼和解碼(簡單兩行):
str->bytes:encode編碼
bytes->str:decode解碼
udp綁定端口:
用上方的小程序發送信息,咱們每次發送的數據,端口好都是會改變的,因此須要咱們對端口進行綁定
綁定示例:工具
from socket import * # 1. 建立套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 2. 綁定本地的相關信息,若是一個網絡程序不綁定,則系統會隨機分配 local_addr = ('', 7788) # ip地址和端口號,ip通常不用寫,表示本機的任何一個ip udp_socket.bind(local_addr) # 3. 等待接收對方發送的數據 recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字節數 # 4. 顯示接收到的數據 print(recv_data[0].decode('gbk')) # 5. 關閉套接字 udp_socket.close()
udp小程序的實戰(面向對象開發):簡單的聊天室(一塊兒使用python的基礎知識和上訪的udp來實戰吧^_^)編碼
import socket #這個是發送信息的函數 def send_msg(udp_socket): """獲取鍵盤數據,並將其發送給對方""" # 1. 從鍵盤輸入數據 msg = input("\n請輸入要發送的數據:") # 2. 輸入對方的ip地址 dest_ip = input("\n請輸入對方的ip地址:") # 3. 輸入對方的port dest_port = int(input("\n請輸入對方的port:")) # 4. 發送數據 udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port)) #這個是接受數據的函數 def recv_msg(udp_socket): """接收數據並顯示""" # 1. 接收數據 recv_msg = udp_socket.recvfrom(1024) # 2. 解碼 recv_ip = recv_msg[1] recv_msg = recv_msg[0].decode("utf-8") # 3. 顯示接收到的數據 print(">>>%s:%s" % (str(recv_ip), recv_msg)) #主函數 def main(): # 1. 建立套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2. 綁定本地信息 udp_socket.bind(("", 7890)) while True: # 3. 選擇功能 print("="*30) print("1:發送消息") print("2:接收消息") print("="*30) op_num = input("請輸入要操做的功能序號:") # 4. 根據選擇調用相應的函數 if op_num == "1": send_msg(udp_socket) elif op_num == "2": recv_msg(udp_socket) else: print("輸入有誤,請從新輸入...") if __name__ == "__main__": main()