因為不用線程的話隻能做到半雙工(~ _ ~),是以今天就先做一個簡單(簡陋)的聊天器吧…
至于實驗條件,如果你用的是Linux的話,就開兩個終端(快捷鍵: Ctrl + Shift + t),把一份程式複制成兩份(要改代碼裡你綁定的端口喲~)分别運作在兩個終端上,由于ip位址不能重複,是以你可以把其中一個程式的目的ip寫為本機的回環(127.0.0.1)。
如果你用的是Windows的話,同樣你可以在Pycharm上把程式複制一遍作為你要練習的目标運作并連接配接。當然要是你有兩台電腦的話也可以在另一個電腦上運作此程式,前提是你的兩台電腦要在同一個網絡下喲~
如果你是用自己虛拟機裡的Linux和Windows相連接配接的話,要注意了,Windows用的編碼就不是utf-8了,而是gbk。是以在Windows裡寫的程式就應該是encode(“gbk”).
ubuntu效果圖
假設場景:小紅和小輝在互發消息:
小紅的電腦:
import socket
# 發送消息
def send_mes(udp_socket):
# 目标端口
ip_addr = input("請輸入目的ip:")
ip_port = int(input("請輸入目的端口:")) # 端口要求為數字int()更正格式
msg_data = input("請輸入内容:")
udp_socket.sendto(msg_data.encode("utf-8"),(ip_addr,ip_port))
# 接收資料
def recv_mes(udp_socket):
recvdata = udp_socket.recvfrom(1024)
# 列印出來
print("來自%s的消息:%s"% (str(recvdata[1]),recvdata[0].decode("utf-8")))
def main():
# 建立套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 本地端口固定
udp_socket.bind(("",8080))
while True:
print("----------udp聊天器-----------")
print("1:發送消息")
print("2:接收消息")
print("3:退出系統")
op = input("請輸入功能:")
if op == "1":
send_mes(udp_socket)
elif op == "2":
recv_mes(udp_socket)
elif op =="3":
break
else:
print("輸入有誤,請重新輸入!")
# 關閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
小輝的電腦:
import socket
# 發送消息
def send_mes(udp_socket):
# 目标端口
ip_addr = input("請輸入目的ip:")
ip_port = int(input("請輸入目的端口:")) # 端口要求為數字
msg_data = input("請輸入内容:")
udp_socket.sendto(msg_data.encode("utf-8"),(ip_addr,ip_port))
def recv_mes(udp_socket):
# 接收資料
recvdata = udp_socket.recvfrom(1024)
# 列印出來
print("來自%s的消息:%s"% (str(recvdata[1]),recvdata[0].decode("utf-8")))
def main():
# 建立套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 本地端口固定
udp_socket.bind(("",8081))
while True:
print("----------udp聊天器-----------")
print("1:發送消息")
print("2:接收消息")
print("3:退出系統")
op = input("請輸入功能:")
if op == "1":
send_mes(udp_socket)
elif op == "2":
recv_mes(udp_socket)
elif op =="3":
break
else:
print("輸入有誤,請重新輸入!")
# 關閉套接字
udp_socket.close()
if __name__ == '__main__':
main()
Windows效果圖