Python用socket、多线程实现一对一聊天室
一、基于udp協議
1、通信原理
主機A -----發:hello----- 主機B
Hello由應用層往下包裝:
主機A:
應用層:hello
傳輸層:將傳輸協議(UDP)與 hello 包裝
網絡層:將IP地址、傳輸協議(UDP)、hello 包裝
鏈路層:將MAC(網卡地址)、IP地址、傳輸協議(UDP)、hello 包裝
主機B:
鏈路層:MAC(網卡地址)、IP地址、傳輸協議(UDP)、hello
網絡層:IP地址、傳輸協議(UDP)、hello
傳輸層:將傳輸協議、hello
應用層:hello (此時,主機B收到了hello,但是看不見的,此時我們用python寫一個程序綁定主機A發過來的信息時指定的端口,從而收到這個數據包得到這個數據)
二、Socket簡介
Socket是一種完成通過網絡,使進程之間通信的方式。
用IP地址、協議、端口表示網絡的進程,網絡中進程通信就可以利用這個標志與其他進程進行交互
用python完成簡單的發送:
#導入socket模塊 from socket import *#創建socket對象,AF_INET指ipv4協議,SOCK_DGRAM指udp udpSocket=socket(AF_INET,SOCK_DGRAM)#發送數據 def sendData: while True:sendMessage=input("<<")udpSocket.sendto(sendMessage,('192.168.1.1',8080)sendData()用python完成簡單的接收:
from socket import * udpSocket=socket(AF_INET,SOCK_DGRAM) def recvData():while True:#創建接收對象,限定最大接收字節為1024recvInfo=udpSocket.recvfrom(1024)Print(">> %s"%recvInfo)recvData()三、多線程的引入
1、為什么使用多線程???
A send to B
以下面這個程序為例,當程序執行到<------部分時,此時程序跳轉到循環接收信息的狀態,此時A將無法發送消息給B
即使函數順序換過來也是如此,當A在循環發發送信息給B的狀態下時無法執行接收B的信息的。
那么,有沒有一種辦法可以使接收信息與發送消息同時執行呢?使用多線程,正好可以解決此問題。
2、什么是多線程?
打個比方,在windows下運行用一個qq同時和n個qq好友進行聊天,這就是運用了多線程。
完整的局域網一對一的聊天室源碼:
#coding=utf-8 from threading import Thread from socket import *#1.收數據,然后打印 def recvData():while True:recvInfo=udpSocket.recvfrom(1024)print(">>[%s:%s] to you %s:"%(str((recvInfo[1])[0]),str((recvInfo[1])[1]),recvInfo[0].decode("gb2312")))print("<<",end="")#2.檢測鍵盤輸入,發數據 def sendData():try:while True:sendInfo=input("<<")udpSocket.bind((destIp,destPort)) #綁定ip、端口udpSocket.sendto(sendInfo.encode("gb2312"),(destIp,destPort)) #對數據進行轉碼發送except:print("發送失敗!")#給變量賦值none可以接收對象 udpSocket=None destIp="" #對方IP地址 destPort=0 #對方端口號#多線程執行兩個函數 def main():global udpSocket #聲明變量的作用域為全局作用域global destIpglobal destPortdestIp=input("對方的IP:")destPort=int(input("對方的PORT:"))udpSocket=socket(AF_INET,SOCK_DGRAM)udpSocket.bind(("",1314))tr=Thread(target=recvData)ts=Thread(target=sendData)tr.start()ts.start()tr.join()ts.join()if __name__ == "__main__":main()總結
以上是生活随笔為你收集整理的Python用socket、多线程实现一对一聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【长截图】轻松简便、一步实现
- 下一篇: 定义一个Tree(树)类,有成员ages