日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python用socket、多线程实现一对一聊天室

發(fā)布時(shí)間:2023/12/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python用socket、多线程实现一对一聊天室 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、基于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的信息的。

#coding=utf-8 #導(dǎo)入socket模塊 from socket import *#發(fā)送數(shù)據(jù) def sendData: while True: sendMessage=input("<<") udpSocket.sendto(sendMessage,(192.168.1.1,8080))#接收數(shù)據(jù) def recvData():while True:#創(chuàng)建接收對(duì)象,限定最大接收字節(jié)為1024recvInfo=udpSocket.recvfrom(1024)Print(">> %s"%recvInfo)def main():#創(chuàng)建socket對(duì)象,AF_INET指ipv4協(xié)議,SOCK_DGRAM指udpudpSocket=socket(AF_INET,SOCK_DGRAM)recvData() #<--------------------------------------------------------sendData()if __name__ == "__main__":main()

那么,有沒有一種辦法可以使接收信息與發(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。