python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!
原標題:用python寫一個聊天小程序!和女朋友的專屬聊天工具!
1.UDP簡介
Internet協議集支持一個無連接的傳輸協議,該協議稱為用戶數據報協議(UDP)。UDP為應用程序提供了無需建立就可以發送封裝的IP數據包的方法。
Internet的傳輸層有兩個協議,互為補充。無連接是UDP,它除了給應用程序發送數據包功能并允許他們所需的層次上架構自己的協議之外,幾乎沒有做什么特別的事情。面向連接的是TCP,該協議幾乎做了所有的事情。
中文名:用戶數據協議
外文名:User Datagram Protocol
特點:無連接、不可靠、快速傳輸
基礎:IP數據包服務上增加一點功能
類別:傳輸層協議
用途:發送數據包
2.socket
一般socket我們稱為套接字,并且在Python中有socket這個庫(可以使用pip命令自行下載pip install socket)。下面來說一下socket的簡單流程:
1. 獲取套接字
2. 綁定端口
3. 選擇發送或者接受
4. 關閉套接字
2-1 socket的發送
socket的發送很簡單,下面是一般的最簡代碼:
# -*- coding: utf-8 -*-
import socket
def sendMsg():
# 獲取套接字
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 為套接字綁定端口與ip
# 這里的""是表示當前綁定的ip為本機的ip,后面的數字為該程序所綁定的端口號。
# 如果不提前綁定端口號,則可能發送的時候,有電腦自動為該程序分發一個端口號。
send_socket.bind(("", 7879)) # 當然這個端口也可以是7878,即發送的端口,后續會繼續講解
# 設置發送
send_socket.sendto(b"123", ("127.0.0.1", 7878))
# 關閉套接字
send_socket.close()
if __name__ == '__main__':
sendMsg()
2-2 socket的接收
注意,在recv中,一定需要提前綁定端口,因為這是接收消息的前提條件,那么選用什么端口呢?一般做實驗或者寫程序的時候,我們可以選擇的端口范圍在[1024-65535]之間。因為上面已經創建了socket的發送,并且選定了端口號為7878,那么我們此時的端口只需要綁定7878即可。
recv_socket.recvfrom(1024)表示單次接受的最大字節為1024,如果超出這個數值,那么只取前面的1024個。并且該函數返回的值是一個元組,與socket發送時一致(b"123", ("127.0.0.1", 7878)),因此在想要獲取接受的內容是,需要利用下標索引。這里還需要注意一點,因為我們在傳輸的時候是靠字節去傳輸的,因此獲取到的也是字節,我們需要為它進行編碼,但是win系統與linux系統是不相同的,win系統默認的是gbk編碼,但是linux默認的是utf-8編碼,因此在獲取字節之后,需要根據系統的類型選擇相應的解碼格式。
# -*- coding: utf-8 -*-
import socket
def recvMsg():
# 創建套接字
recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口
recv_socket.bind(("", 7878))
# 接收字節
recv_data = recv_socket.recvfrom(1024) # 這里的數字表示單次接受的最大字節數
# 轉化打印出內容
print("接收到來自{},的{}信息".format(recv_data[1],recv_data[0].decode("gbk")))
# 關閉套接字
recv_socket.close()
if __name__ == '__main__':
recvMsg()
3.實現收發功能
我們需要提前了解一些知識點:單工:只能收或者發、半雙工:可以收也可以發,但是不能同時運行、全雙工:同一時刻既可以收也可以發。并且socket是支持同時接收與發送數據的,因此socket是全雙工的。
下面代碼是實現socket的發送與接收功能
# -*- coding: utf-8 -*-
import socket
def SendAndRecv():
"""
套接字是可以同時收發數據的
單工:只能收或者發
半雙工:可以收也可以發,但是不能同時運行
全雙工:同一時刻既可以收也可以發
注意:socket是全雙工
"""
# 獲取套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口(也可以不綁定,只需要查看發送時的端口號,在重新輸入即可,但是這個程序最好提前綁定端口
udp_socket.bind(("", 7789))
# 發送對方信息
udp_socket.sendto(b"hahahah", ("127.0.0.1", 7788))
# 接收對方返回的信息,如果沒有收到字符,則會阻塞,直到有信息返回
recv_data = udp_socket.recvfrom(1024)
# 轉化打印出內容
print("接收到來自{},的{}信息".format(recv_data[1], recv_data[0].decode("gbk")))
# 關閉套接字
udp_socket.close()
if __name__ == '__main__':
SendAndRecv()
上面代碼的確看起來有點“丑陋”我們來給他進行一些封裝
# -*- coding: utf-8 -*-
import socket
def send_msg(udp_socket):
"""發送消息"""
udp_socket.sendto(b'124124', ("127.0.0.1", 7788))
def recv_msg(udp_socket):
"""接收數據"""
recv_data = udp_socket.recvfrom(1024)
print("%s:%s" % (str(recv_data[1]), recv_data[0].decode("gbk"))) # 如果是win系統通信,需要把deckde的解碼格式改為gbk,但是在linux中可以為utf-8
def main():
# 創建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口
udp_socket.bind(("", 7789))
# 循環來處理事情
while True:
print("------DreamsPy聊天器------")
print("1:發送消息")
print("2:接收消息")
print("0:退出系統")
op = input("請輸入功能:")
if op == "1":
# 發送
send_msg(udp_socket)
elif op == "2":
# 接收數據并顯示
recv_msg(udp_socket)
elif op == "0":
break
else:
print("您輸入的命令有誤,請重新輸入")
if __name__ == '__main__':
main()
以上代碼實現了程序的接受和發送。但是我們需要寫兩個程序來驗證是否能執行吧,以下兩個就是發送的檢測代碼和接收的檢測代碼。
# -*- coding: utf-8 -*-
import socket
def recvMsg():
# 創建套接字
recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口
recv_socket.bind(("", 7788))
# 接收字節
recv_data = recv_socket.recvfrom(1024) # 這里的數字表示單次接受的最大字節數
# 轉化打印出內容
print("接收到來自{},的{}信息".format(recv_data[1],recv_data[0].decode("gbk")))
# 關閉套接字
recv_socket.close()
if __name__ == '__main__':
recvMsg()
上面的代碼是主程序接收是否能實現。
# -*- coding: utf-8 -*-
import socket
def sendMsg():
# 獲取套接字
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 設置發送
send_socket.sendto(b"123", ("127.0.0.1", 7789))
# 關閉套接字
send_socket.close()
if __name__ == '__main__':
sendMsg()
上面的代碼是主程序發送是否能實現。
當然為了嚴謹,同樣可以在main函數里加上while True進行無限循環來驗證,并且可以用戶手動輸入需要發送的ip地址、端口號、發送內容。這里就不一一寫出來了,剩下的就留給大家了。
以上就是python利用socket寫的聊天小程序。思路比較簡單,代碼也比較容易上手。tcp也是重點(后續會發),多多復習多多練習喲。返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python oracle数据库开发_p
- 下一篇: 拍卖源码java_Java并发的AQS原