Python UDP聊天器
生活随笔
收集整理的這篇文章主要介紹了
Python UDP聊天器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
注釋:下面的邏輯分析思路來自李偉老師,感謝在python學習道路上提供的幫助。
程序需求說明:
在一個客戶端中編寫個程序,有3個基本的功能:
- 1.首先獲取鍵盤數據,并將其發送給對方
- 2.對方接收數據并顯示
- 3.退出聊天系統
接下來我們分析下思路
功能: 1、發送消息 2、接收消息 3、退出系統
設計:
- 發送消息 send_msg()
- 接收消息 recv_msg()
- 程序入口 main()
主入口:
1、導入模塊 2、創建套接字 3、綁定端口 發送消息:
- 1、保存接收方信息(用戶輸入)
- 2、保存接收方端口號(用戶輸入)
- 3、保存要發送的內容(用戶輸入)
- 4、把用戶輸入的內容編碼并發送
接收消息:
1、使用socket recvfrom 接收數據
2、解碼數據并且輸出
代碼實現:
定義一個send_msg()發送消息和recv_msg()接受消息的函數,是最基本的消息功能,下面通訊所用的是底層socket套接字。
import socketdef send_msg(udp_socket):"""發送消息的方法"""# 1、輸入接收方的ip地址ipaddr = input("請輸入接收方地址:\n")if len(ipaddr) == 0: #如果不輸入對應的ip地址,默認設置為本機的ip地址ipaddr = "192.168.1.1." #使用 ifconfig 命令 查看本機的ip地址print("默認設置為:%s" % ipaddr)# 2、輸入接收方的端口port = input("請輸入接收方端口號:\n")if len(port) == 0: # 端口不寫,提供一個默認值port = "2438"print("默認設置為:%s" % port)# 3、要求輸入要發送的內容content = input("請輸入要發送的內容:\n")# 4、發送數據udp_socket.sendto(content.encode(), (ipaddr, int(port)))def recv_msg(udp_socket):# 1、接收數據 1024表示本次接受的最大的字節數recv_data = udp_socket.recvfrom(1024)# 2、把接收到的數據(二進制)解碼并且顯示出來re_text = recv_data[0].decode()print("接收到消息為:%s" % re_text)ip_port = recv_data[1]# 3、打印顯示發送方的IP和端口信息print(ip_port)main()函數是主程序的入口,上面是定義,下面我們來調用
if __name__ == '__main__':# 創建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 綁定端口為2438 udp_socket.bind(("", 2438))while True:# 給出提示,顯示聊天器的主要功能print("*************************")print("**** 1.發送消息 ****")print("**** 2.接收消息 ****")print("**** 3.退出系統 ****")print("*************************")# 1、提示用戶選擇功能num = int(input("請選擇功能:\n"))# 2、判斷用戶選擇# 如果選擇1,調用發送消息的函數if num == 1:# print("您選擇了發送消息")send_msg(udp_socket)# 如果選擇2,調用接收消息的函數elif num == 2:# print("您recv_msg(udp_socket)# 如果選擇3,退出程序執行else:print("程序正在退出...")breakprint("程序已退出!~")# 關閉套接字 udp_socket.close()注意:
這個程序是簡單的了解下udp的通信過程,有許多的bug。比如說當我們選擇了接受消息的時候,可是這個時候并沒有消息,會造成堵塞的問題,解決的方法是接受發送消息一起進行,這個問題我們先放在這里以后再解決。
總結
以上是生活随笔為你收集整理的Python UDP聊天器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySql数据库中的子查询使用
- 下一篇: Python TCP聊天器