Python用socket、多线程实现一对一聊天室
一、基于udp協(xié)議
1、通信原理
主機(jī)A -----發(fā):hello----- 主機(jī)B
Hello由應(yīng)用層往下包裝:
主機(jī)A:
應(yīng)用層:hello
傳輸層:將傳輸協(xié)議(UDP)與 hello 包裝
網(wǎng)絡(luò)層:將IP地址、傳輸協(xié)議(UDP)、hello 包裝
鏈路層:將MAC(網(wǎng)卡地址)、IP地址、傳輸協(xié)議(UDP)、hello 包裝
主機(jī)B:
鏈路層:MAC(網(wǎng)卡地址)、IP地址、傳輸協(xié)議(UDP)、hello
網(wǎng)絡(luò)層:IP地址、傳輸協(xié)議(UDP)、hello
傳輸層:將傳輸協(xié)議、hello
應(yīng)用層:hello (此時(shí),主機(jī)B收到了hello,但是看不見的,此時(shí)我們用python寫一個(gè)程序綁定主機(jī)A發(fā)過(guò)來(lái)的信息時(shí)指定的端口,從而收到這個(gè)數(shù)據(jù)包得到這個(gè)數(shù)據(jù))
二、Socket簡(jiǎn)介
Socket是一種完成通過(guò)網(wǎng)絡(luò),使進(jìn)程之間通信的方式。
用IP地址、協(xié)議、端口表示網(wǎng)絡(luò)的進(jìn)程,網(wǎng)絡(luò)中進(jìn)程通信就可以利用這個(gè)標(biāo)志與其他進(jìn)程進(jìn)行交互
用python完成簡(jiǎn)單的發(fā)送:
#導(dǎo)入socket模塊 from socket import *#創(chuàng)建socket對(duì)象,AF_INET指ipv4協(xié)議,SOCK_DGRAM指udp udpSocket=socket(AF_INET,SOCK_DGRAM)#發(fā)送數(shù)據(jù) def sendData: while True:sendMessage=input("<<")udpSocket.sendto(sendMessage,('192.168.1.1',8080)sendData()用python完成簡(jiǎn)單的接收:
from socket import * udpSocket=socket(AF_INET,SOCK_DGRAM) def recvData():while True:#創(chuàng)建接收對(duì)象,限定最大接收字節(jié)為1024recvInfo=udpSocket.recvfrom(1024)Print(">> %s"%recvInfo)recvData()三、多線程的引入
1、為什么使用多線程???
A send to B
以下面這個(gè)程序?yàn)槔?#xff0c;當(dāng)程序執(zhí)行到<------部分時(shí),此時(shí)程序跳轉(zhuǎn)到循環(huán)接收信息的狀態(tài),此時(shí)A將無(wú)法發(fā)送消息給B
即使函數(shù)順序換過(guò)來(lái)也是如此,當(dāng)A在循環(huán)發(fā)發(fā)送信息給B的狀態(tài)下時(shí)無(wú)法執(zhí)行接收B的信息的。
那么,有沒有一種辦法可以使接收信息與發(fā)送消息同時(shí)執(zhí)行呢?使用多線程,正好可以解決此問(wèn)題。
2、什么是多線程?
打個(gè)比方,在windows下運(yùn)行用一個(gè)qq同時(shí)和n個(gè)qq好友進(jìn)行聊天,這就是運(yùn)用了多線程。
完整的局域網(wǎng)一對(duì)一的聊天室源碼:
#coding=utf-8 from threading import Thread from socket import *#1.收數(shù)據(jù),然后打印 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.檢測(cè)鍵盤輸入,發(fā)數(shù)據(jù) def sendData():try:while True:sendInfo=input("<<")udpSocket.bind((destIp,destPort)) #綁定ip、端口udpSocket.sendto(sendInfo.encode("gb2312"),(destIp,destPort)) #對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)碼發(fā)送except:print("發(fā)送失敗!")#給變量賦值none可以接收對(duì)象 udpSocket=None destIp="" #對(duì)方IP地址 destPort=0 #對(duì)方端口號(hào)#多線程執(zhí)行兩個(gè)函數(shù) def main():global udpSocket #聲明變量的作用域?yàn)槿肿饔糜?/span>global destIpglobal destPortdestIp=input("對(duì)方的IP:")destPort=int(input("對(duì)方的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()總結(jié)
以上是生活随笔為你收集整理的Python用socket、多线程实现一对一聊天室的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【长截图】轻松简便、一步实现
- 下一篇: python3 列表list 内置函数