ipmsg C#局域網(wǎng)聊天工具、消息推送實(shí)現(xiàn)思路與源碼
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
C#局域網(wǎng)聊天工具怎么實(shí)現(xiàn)? 1. 網(wǎng)絡(luò)通訊編程的基礎(chǔ)便是協(xié)議,信息的發(fā)送常用的協(xié)議有面向連接的TCP協(xié)議,以及不面向連接的UDP協(xié)議 2. TCP:TransmissionControlProtocol傳輸控制協(xié)議,其是一種面向連接的、可靠的字節(jié)流服 務(wù)。[]面向連接意味著兩個(gè)使用TCP的應(yīng)用(通常是一個(gè)客戶和一個(gè)服務(wù)器)在彼此交換數(shù)據(jù)之前必須先建立一個(gè)TCP連接。這一過(guò)程與打電話很相似,先撥號(hào)振鈴,等待對(duì)方摘機(jī)說(shuō)“喂”,然后才說(shuō)明是誰(shuí)。 3. UDP:UserDatagramProtocol用戶數(shù)據(jù)報(bào)協(xié)議(RFC768),UDP傳送數(shù)據(jù)前并不與對(duì)方建立連 接,即UDP是無(wú)連接的,在傳輸數(shù)據(jù)前,發(fā)送方和接收方相互交換信息使雙方同步。 4. 系統(tǒng)也要定義自己的通訊協(xié)議,來(lái)完成一些系統(tǒng)的功能,如用戶上,下線的通知,都要定義 自己的通訊協(xié)議來(lái)完成相應(yīng)的功能!也可以稱這種自定義的協(xié)議為“命令”. 5. 下面以著名的飛鴿傳書為例,說(shuō)明其自定義的協(xié)議(命令) IPMSG_NOOPERATION不進(jìn)行任何操作 IPMSG_BR_ENTRY用戶上線 IPMSG_BR_EXIT用戶退出 IPMSG_ANSENTRY通報(bào)在線 IPMSG_SENDMSG發(fā)送消息 IPMSG_RECVMSG通報(bào)收到消息 IPMSG_GETFILEDATA請(qǐng)求通過(guò)TCP傳輸文件 IPMSG_RELEASEFILES停止接收文件 IPMSG_GETDIRFILES請(qǐng)求傳輸文件夾以“IPMSG_BR_ENTRY用戶上線”和“IPMSG_ANSENTRY通報(bào)在線”為例說(shuō)明命令處理流程:當(dāng)程序啟動(dòng)時(shí),命令I(lǐng)PMSG_BR_ENTRY被廣播到網(wǎng)絡(luò)中,向所有在線的用戶提示一個(gè)新用戶的到達(dá)(即表示“我來(lái)了”);所有在線用戶將把該新上線用戶添加到自己的用戶列表中,并向該新上線用戶發(fā)送IPMSG_ANSENTRY命令(即表示“我在線”);該新上線用戶接收到IPMSG_ANSENTRY命令后即將在線用戶添加到自己的用戶列表中。 PS:根據(jù)本系統(tǒng)的特征,可以在聊天部分采用UDP協(xié)議,在文件傳輸,視頻,語(yǔ)音功能上采用TCP協(xié)議 6. 程序啟動(dòng)就要發(fā)送廣播消息,如何發(fā)送廣播消息,以及C#如何實(shí)現(xiàn)廣播. 第一部分.什么是廣播地址,以及廣播地址怎么計(jì)算 1.1廣播地址是什么? 主機(jī)號(hào)全為1,用于向一個(gè)網(wǎng)絡(luò)內(nèi)的所有主機(jī)發(fā)送信息的IP地址.如:受限的廣播地址是255.255.255.255。該地址用于主機(jī)配置過(guò)程中IP數(shù)據(jù)報(bào)的目的地址,此時(shí),主機(jī)可能還不知道它所在網(wǎng)絡(luò)的網(wǎng)絡(luò)掩碼,甚至連它的IP地址也不知道。在任何情況下,路由器都不轉(zhuǎn)發(fā)目的地址為受限的廣播地址的數(shù)據(jù)報(bào),這樣的數(shù)據(jù)報(bào)僅出現(xiàn)在本地網(wǎng)絡(luò)中。 PS:一般無(wú)特殊要求廣播地址選擇255.255.255.255即可. 1.2計(jì)算方法 首先計(jì)算網(wǎng)絡(luò)地址=IP地址邏輯與(&)子網(wǎng)掩碼 先把IP,子網(wǎng)掩碼轉(zhuǎn)為2進(jìn)制,然后進(jìn)行邏輯與運(yùn)算,得出網(wǎng)絡(luò)地址 例: IP192.168.1.3子網(wǎng)掩碼255.255.0.0 IP轉(zhuǎn)二進(jìn)制11000000.10100100.00000001.00000011 子網(wǎng)掩碼11111111.11111111.00000000.00000000 與運(yùn)算后11000000.10100100.00000000.00000000 192.168.0.0這就是網(wǎng)絡(luò)地址,其中子網(wǎng)掩碼全1對(duì)應(yīng)為網(wǎng)絡(luò)號(hào),全0對(duì)應(yīng)的是主機(jī)號(hào),即192.168.0.0對(duì)應(yīng)的網(wǎng)絡(luò)號(hào)為192.168,主機(jī)號(hào)為0.0.將網(wǎng)絡(luò)地址主機(jī)部分全取反后得到的地址便是廣播地址: 廣播地址11000000.10100100.11111111.11111111 換成10進(jìn)制則為192.168.0.0 ipmsg C#局域網(wǎng)聊天工具、消息推送實(shí)現(xiàn)思路與源碼 第二部分.C#利用UDP協(xié)議如何實(shí)現(xiàn)廣播 2.1如何實(shí)現(xiàn)UDP廣播,直接舉例說(shuō)明: button1_Click時(shí)使用了UDP廣播向外發(fā)送了數(shù)據(jù) RecData()在后臺(tái)接受UDP協(xié)議的消息 //UDP通過(guò)廣播實(shí)現(xiàn)群發(fā)功能 namespace BroadcastExample { public partial class Form1:Form { delegate void AppendStringCallback(stringtext); AppendStringCallback appendstringcallback; //使用的接收端口51008 ///<summary> ///端口號(hào) ///</summary> private int port=51008; ///<summary> ///udp連接對(duì)象 ///</summary> private UdpClient udpclient; public Form1() { InitializeComponent(); appendstringcallback = new AppendStringCallback(AppendString); } ///<summary> ///委托對(duì)象的處理過(guò)程 ///</summary> ///<paramname="text"></param> private void AppendString(stringtext) { if(richtextBox2.InvokeRequired==true) { this.Invoke(appendstringcallback,text); } else { richtextBox2.AppendText(text+"\r\n"); } } ///<summary> ///在后臺(tái)運(yùn)行的接收線程 ///</summary> private void RecData() { //本機(jī)指定端口接收 udpclient=new UdpClient(port); IPEndPoint remote=null; ipmsg C#局域網(wǎng)聊天工具、消息推送實(shí)現(xiàn)思路與源碼 //接收從遠(yuǎn)程主機(jī)發(fā)送過(guò)來(lái)的信息 while(true) { try { //關(guān)閉udpclient時(shí)此句會(huì)產(chǎn)生異常 byte[]bytes= (refremote); stringstr=Enco (bytes,0,bytes.Length); AppendString(string.Format("來(lái)自{0}:{1}",remote,str)); } catch { //退出循環(huán),結(jié)束線程 break; } } } privatevoidForm1_Load(objectsender,EventArgse) { //創(chuàng)建一個(gè)線程接收接收遠(yuǎn)程主機(jī)發(fā)來(lái)的信息 Thread mythread=new Thread(new ThreadStart(RecData)); //將線程設(shè)為后臺(tái)運(yùn)行 mythread.IsBackground=true; mythread.Start(); } private void Form1_FormClosing(objectsender,FormClosingEventArgse) { udpclient.Close(); } private void button1_Click(objectsender,EventArgse) { UdpClient myUdpclient=newUdpClient(); 該文章在 2016/12/23 18:41:03 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |