因爲筆者是第一次接觸到socket,所以說的也不太清楚,以後有新的感悟就再續吧。
剛開始查閱資料,但文字實在看不懂,所以就在bilibili上找了視頻看例子黑馬Python就業班-網絡編程再結合《python程序設計》第2版第10章的練習,對socket的運用上也有了一些心得
socket的成功使用需要兩個系統之間的配合:
客戶端A:ip 192.168.1.10
接收端代碼:
1.創建套接字(socket)
2.綁定本地信息(ip和port)
3.接收數據
4.打印接收到的數據
5.關閉套接字
#!/usr/bin/python # -*_ coding: UTF-8 -*- # 1.綁定端口用來接收數據 import socket #創建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #綁定本地信息 udp_socket.bind(("",8888)) #接收數據 recv_data = udp_socket.recvfrom(1024) #打印接收的數據 print(recv_data) #關閉套接字 udp_socket.close()
#!/usr/bin/python # -*- coding: utf-8 -*- # 2.解析接收到的數據 import socket #建立一個socket套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #綁定端口,空字符字符串表示本機任何可用ip地址 udp_socket.bind(("",8888)) #創建循環數據接收 while True: #接收1024字節的數據 recv、recvfrom recv_data = udp_socket.recvfrom(1024) #recv_data 這個變量中存儲的是一個元組(接收到的數據,(發送方的ip,port)) recv_msg = recv_data[0] #存儲接收到的數據 send_addr = recv_data[1] #存儲發送方的地址信息 #打印數據 print("%s:%s"%(str(send_addr),recv_msg.encode("gbk")) #關閉套接字 udp_socket.close()
書中接收端例子
# 書中發送端例子 import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(("",5000)) while True: data, addr = s.recvfrom(1024) print("receiver message:{0} from PORT {1} on {2}",format(data.decode(), addr[1], addr[0])) if data.decode().lower() == "bye": break s.close()
客戶端B:ip 192.168.1.20
1.創建socket套接字
2.發送數據
3.關閉套接字
#!/usr/bin/python # -*- coding:utf-8 -*- #1.普通發送數據 import socket #創建套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #發送數據 #udp_socket.sendto("hhh",("192.168.1.10",8888)) #發送數據處理,強制所有數據爲bytes類型 udp_socket.sendto(b"hhh",("192.168.1.10",8888)) #關閉套接字 udp_socket.close()
#!/usr/bin/python # -*- coding:utf-8 -*- # 2.從鍵盤接收發送的數據 import socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) socket_input = input("請輸入要發送的數據:") #通過encode()對輸入的內容進行轉碼, udp_socket.sendto(socket_input.encode("utf-8"), ("192.168.1.10", 8888)) udp_socket.close()
# 3.帶有退出功能的循環發送 import socket udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #(發送端可選)綁定本地信息,不綁定的話系統會隨機分配一個端口 udp_socket.bind("", 7788) #創建循環發送數據程序 while True: socket_input = input("請輸入要發送的數據:") udp_socket.sendto(socket_input.encode("utf-8"), ("192.168.1.10"), 8888) #如果輸入exit,則退出 if socket_input == "exit": break udp_socket.close()
書中發送端例子
# 書中發送端例子 import socket import sys s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(sys.argv[1].encode(), ("192.168.1.10"), 5000) s.close()