Linux環(huán)境下局域網(wǎng)通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
1 引 言
客戶(hù)機(jī)/服務(wù)器模型中,發(fā)起連接的計(jì)算機(jī)被稱(chēng)為客戶(hù)機(jī),接收并建立連接的計(jì)算機(jī)被稱(chēng)為服務(wù)器。根據(jù)此模型,計(jì)算機(jī)網(wǎng)絡(luò)通信也多采用架設(shè)服務(wù)器并通過(guò)服務(wù)器轉(zhuǎn)發(fā)的方式進(jìn)行客戶(hù)機(jī)之間的數(shù)據(jù)通信,然而,這種網(wǎng)絡(luò)通信方式存在一定的缺點(diǎn),主要在于:
(1)如果網(wǎng)絡(luò)中各主機(jī)間需要通信,就必須先要架設(shè)服務(wù)器,使用非常不方便。
(2)各個(gè)網(wǎng)絡(luò)主機(jī)之間的通信數(shù)據(jù)必須先由源客戶(hù)機(jī)發(fā)給服務(wù)器,再通過(guò)服務(wù)器轉(zhuǎn)發(fā)至目的客戶(hù)機(jī),因此數(shù)據(jù)并沒(méi)有在客戶(hù)機(jī)之間直接傳遞,通信效率較低。
本文就是針對(duì)以上問(wèn)題,以客戶(hù)機(jī)/服務(wù)器模型為基礎(chǔ),設(shè)計(jì)出一種不需要服務(wù)器支持的局域網(wǎng)通信系統(tǒng),使局域網(wǎng)內(nèi)不同計(jì)算機(jī)問(wèn)的通信不再需要通過(guò)服務(wù)器中轉(zhuǎn),實(shí)現(xiàn)了不同計(jì)算機(jī)問(wèn)的數(shù)據(jù)的直接傳輸。
2 系統(tǒng)框架設(shè)計(jì)
ISO的OSI七層模型中,傳輸層有TCP和UDP兩種協(xié)議,對(duì)應(yīng)于這兩種協(xié)議有流式套接字和數(shù)據(jù)報(bào)套接字。該系統(tǒng)使用了UDP廣播消息和建立TCP連接進(jìn)行數(shù)據(jù)傳輸?shù)姆绞健?/P>
多線程的并行處理可以提高程序的吞吐量,多任務(wù)的相互獨(dú)立性也使程序在運(yùn)行時(shí)間效率方面得到提高。網(wǎng)絡(luò)通信中任務(wù)繁雜,因此將網(wǎng)絡(luò)通信機(jī)制與多線程并行處理機(jī)制結(jié)合是一種有效的解決方案。該系統(tǒng)的通信任務(wù)主要通過(guò)3個(gè)線程并行完成,分別為:
(1)負(fù)責(zé)收發(fā)廣播的線程:該線程通過(guò)收發(fā)廣播消息的形式,獲得局域網(wǎng)內(nèi)使用該系統(tǒng)的計(jì)算機(jī)信息。將局域網(wǎng)內(nèi)使用該系統(tǒng)的計(jì)算機(jī)信息添加進(jìn)本地鏈表;將局域網(wǎng)內(nèi)退出該系統(tǒng)的計(jì)算機(jī)信息從本地鏈表中刪除。本地鏈表維護(hù)了局域網(wǎng)內(nèi)所有使用該系統(tǒng)的計(jì)算機(jī)的信息,為系統(tǒng)其他功能的實(shí)現(xiàn)提供數(shù)據(jù)。
(2)負(fù)責(zé)監(jiān)聽(tīng)端口建立連接的線程:該線程的功能類(lèi)似于客戶(hù)機(jī)/服務(wù)器模型中的服務(wù)器端,對(duì)局域網(wǎng)中的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng),對(duì)于新的連接請(qǐng)求建立新的Socket用于連接,并且對(duì)于不同的連接請(qǐng)求創(chuàng)建新的數(shù)據(jù)接收線程,用于處理連接后的消息傳遞以及文件傳輸?shù)裙δ堋?/P>
(3)負(fù)責(zé)處理外部終端控制命令的線程:該線程用于該系統(tǒng)與用戶(hù)的交互,處理外部終端的控制命令,并對(duì)于不同的命令實(shí)現(xiàn)相應(yīng)的功能。
系統(tǒng)結(jié)構(gòu)如圖1所示。
3 系統(tǒng)實(shí)現(xiàn)具體流程
3.1 發(fā)送和接收廣播的線程設(shè)計(jì)流程
廣播消息線程使用UDP套接口,他與TCP套接口的主要區(qū)別在于通信雙方不需要事先建立連接即可收發(fā)數(shù)據(jù)。該線程工作流程如下:
(1)主機(jī)在局域網(wǎng)中廣播本機(jī)“上線”消息;
(2)主機(jī)等待接收局域網(wǎng)中的廣播消息;
(3)如果主機(jī)收到其他計(jì)算機(jī)“上線”廣播消息,則將發(fā)送該廣播消息的計(jì)算機(jī)信息添加進(jìn)本地鏈表,并且回復(fù)“確認(rèn)”廣播消息;如果主機(jī)收到“確認(rèn)”廣播消息,則對(duì)發(fā)送該廣播消息的計(jì)算機(jī)信息進(jìn)行判斷,如果鏈表中沒(méi)有記錄,則添加進(jìn)本地鏈表;如果主機(jī)收到“離線”廣播消息,則將發(fā)送該消息的計(jì)算機(jī)在本地鏈表中的信息刪除。
3.2 監(jiān)聽(tīng)端口建立連接的線程設(shè)計(jì)流程
該線程監(jiān)聽(tīng)TCP套接口,對(duì)于不同的連接請(qǐng)求創(chuàng)建新的數(shù)據(jù)接收線程并發(fā)處理。工作流程如下:
(1)創(chuàng)建本地Socket,并監(jiān)聽(tīng)局域網(wǎng)中的連接請(qǐng)求;
(2)如果有連接請(qǐng)求進(jìn)人,接收連接請(qǐng)求,并創(chuàng)建新的Socket和數(shù)據(jù)接收線程用于該連接的數(shù)據(jù)通信功能的實(shí)現(xiàn)。
因?yàn)樵撓到y(tǒng)提供文件傳輸功能,所以在數(shù)據(jù)接收線程接收到數(shù)據(jù)包后,需要判斷該數(shù)據(jù)包中的信息是否為文件傳輸開(kāi)始標(biāo)志。如果是文件傳輸開(kāi)始標(biāo)志,表明信息發(fā)送方將傳輸文件,則主機(jī)進(jìn)入文件接收工作程序;如果不是文件傳輸開(kāi)始標(biāo)志,則主機(jī)在終端上顯示接收到的消息。
3.3 命令處理線程的主要控制命令及其設(shè)計(jì)流程
(1)局域網(wǎng)在線計(jì)算機(jī)查詢(xún)命令:順序讀取主機(jī)鏈表中所維護(hù)的所有的節(jié)點(diǎn)信息,終端顯示局域網(wǎng)中所有在線計(jì)算機(jī)情況,包括其主機(jī)名、IP地址等;
(2)主機(jī)離線命令:廣播“離線”消息,斷開(kāi)Socket連接,結(jié)束進(jìn)程。
(3)發(fā)起連接命令:通過(guò)查詢(xún)系統(tǒng)維護(hù)的計(jì)算機(jī)信息鏈表,獲得想要與之建立連接的計(jì)算機(jī)的信息,發(fā)起連接,若連接成功,創(chuàng)建數(shù)據(jù)發(fā)送線程用于處理連接后的命令操作以及數(shù)據(jù)通信,并且阻塞命令處理線程,直到數(shù)據(jù)發(fā)送線程結(jié)束返回。
數(shù)據(jù)發(fā)送線程對(duì)終端輸入進(jìn)行讀取和判斷,如果是文件傳輸命令,則進(jìn)入文件發(fā)送工作程序;否則,直接發(fā)送消息。
該系統(tǒng)的文件發(fā)送與接收流程如圖2所示。
4 系統(tǒng)實(shí)現(xiàn)主要代碼
5 結(jié) 語(yǔ)
本文基于網(wǎng)絡(luò)Socket通信原理與多線程技術(shù),給出了在Linux環(huán)境下不需要服務(wù)器支持的網(wǎng)絡(luò)通信系統(tǒng)的設(shè)計(jì)與算法實(shí)現(xiàn),此實(shí)現(xiàn)方法使局域網(wǎng)的計(jì)算機(jī)間通信效率得到了提高并且該系統(tǒng)使用非常方便,適用于局域網(wǎng)計(jì)算機(jī)間的即時(shí)數(shù)據(jù)通信。如何在此系統(tǒng)框架的基礎(chǔ)上添加更多的數(shù)據(jù)通信功能以及如何加快文件傳輸速度將是進(jìn)一步的研究工作。
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論