今日思維導圖
每日代碼
udp聊天器
import socket
"""
這段代碼可以實現(xiàn)循環(huán)進行收發(fā)消息,但是同一時間只能進行一個動作
"""
def send_msg(udp_socket):
"""發(fā)送數(shù)據(jù)"""
# 發(fā)送數(shù)據(jù)
client_ip = input("請輸入對方ip: ")
client_port = int(input("請輸入對方端口:"))
send_data = input("請輸入要發(fā)送的內容:")
# 發(fā)送數(shù)據(jù),使用encode進行編碼,ip和端口要放在元組中
udp_socket.sendto(send_data.encode("utf-8"), (client_ip, client_port))
def recv_msg(udp_socket):
"""接收數(shù)據(jù)"""
# 接收數(shù)據(jù) ,需要指定要接收的字節(jié),1024就是 1KB
recv_data = udp_socket.recvfrom(1024)
# recvfrom返回的數(shù)據(jù)時一個元組,第一個元素是地址,第二個元素是接收到的消息
# 使用decode 進行解碼
print("%s: %s" % (str(recv_data[1]), recv_data[0].decode("utf-8")))
def main():
# 創(chuàng)建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定本地信息,可以知道ip和端口
udp_socket.bind(("", 6666))
while True:
print("---udp聊天器---")
print("1. 發(fā)送數(shù)據(jù)")
print("2. 接收數(shù)據(jù)")
print("0. 退出")
op = input("請輸入要進行的操作")
if op == "1":
# 調用發(fā)送數(shù)據(jù)的函數(shù)
send_msg(udp_socket)
elif op == "2":
# 調用接收數(shù)據(jù)的函數(shù)
recv_msg(udp_socket)
elif op == "0":
break
else:
print("輸入有誤,請重新輸入")
udp_socket.close()
if __name__ == "__main__":
main()
tcp服務器代碼
import socket
"""tcp服務器"""
def main():
# 創(chuàng)建套接字, tcp的參數(shù)時SOCK_STREAM
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定本地地址, 本地地址和端口可能需要重新指定
tcp_socket.bind(("", 6666))
# 由主動變成被動接聽, listen方法可以指定同時連接的客戶端
tcp_socket.listen(128)
while True:
# 循環(huán)接聽客戶
# 等待客戶端連接, 當有客戶連接,accept方法返回一個元組
# 元組第一個元素是一個新的套接字,只針對于當前連接的這個客戶端;第二個元素是客戶端地址
colient_socket, colient_addr = tcp_socket.a(chǎn)ccept()
# 接收數(shù)據(jù)
print(colient_addr)
while True:
# 循環(huán)和同一個客戶端聯(lián)系
colient_data = colient_socket.recv(1024)
print(colient_data.decode("utf-8"))
if colient_data:
# 進行判斷,只有客戶端還在發(fā)送數(shù)據(jù),就返回一個數(shù)據(jù)給客戶端
# 發(fā)揮一部分數(shù)據(jù)給客戶端
colient_socket.send("嘿嘿嘿".encode("utf-8"))
else:
# 沒有數(shù)據(jù)就
break
# 關閉套接字
colient_socket.close()
tcp_socket.close()
if __name__ == "__main__":
main()
tcp客戶端代碼
import socket
"""tcp客戶端"""
def main():
# 創(chuàng)建套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 鏈接服務器, tcp客戶端需要先鏈接服務器
tcp_socket.connect(("192.168.xxx.xxx", 6666))
while True:
# 循環(huán)和服務器聯(lián)系
# 發(fā)送數(shù)據(jù)
print("輸入【exit】退出鏈接")
send_data = input("請輸入要發(fā)送的數(shù)據(jù):")
if send_data == "exit":
break
tcp_socket.send(send_data.encode("utf-8"))
# 接收服務器返回的數(shù)據(jù)
server_data = tcp_socket.recv(1024)
print(server_data.decode("utf-8"))
# 關閉套接字
tcp_socket.close()
if __name__ == "__main__":
main()
在 tcp 這里碰見了一個奇怪的BUG
服務器和客戶端運行起來后,輸入正常數(shù)據(jù)沒有問題,當只輸入一個回車時,程序不發(fā)送數(shù)據(jù)也不接受數(shù)據(jù)只能強行接受,問了下,沒有解決,這玩意好像是因為操作系統(tǒng)底層的原因, 后面再研究研究。
今天內容需要記憶和理解都比較多,不過還算可以接受。
最近在試著使用 Typora 練習 Markdown 寫作方式,不是很熟練,寫出來有點亂,慢慢練習熟練了再使用這種方式吧。
-
UDP
+關注
關注
0文章
330瀏覽量
34388 -
python
+關注
關注
56文章
4822瀏覽量
85900
發(fā)布評論請先 登錄
TCP協(xié)議與UDP協(xié)議的區(qū)別
TCP三次握手與UDP的區(qū)別
ID讀卡器TCP協(xié)議QT小程序開發(fā)

一文了解Android UDP通信
如何在Python中使用socket
CMW500進行LTE TCP和UDP測試方法

功能強大的網(wǎng)絡通訊工具,支持各類TCP、UDP、HTTP的通訊協(xié)議
深度解析TCP與UDP協(xié)議

tcp和udp的區(qū)別和聯(lián)系
Purple Pi OH在Android11下測試WiFi和LAN的TCP和UDP傳輸速率

評論