国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

關(guān)于Socket 的編程研究

2021-03-05 14:57:43徐洪麗楊傳棟王秀麗
科技創(chuàng)新導(dǎo)報(bào) 2021年27期
關(guān)鍵詞:端口號(hào)應(yīng)用層服務(wù)器端

徐洪麗 楊傳棟 王秀麗

摘 要:Socket是網(wǎng)絡(luò)通信中的常用技術(shù),有著廣泛的應(yīng)用前景和意義。本文首先給出了Socket含義,然后關(guān)注了Socket通信過(guò)程中的注意事項(xiàng),Socket常用方法及多線程Socket通訊,最后研究了套接字心跳機(jī)制,設(shè)計(jì)思路及其注意事項(xiàng),Socket長(zhǎng)連接及其常用步驟,為套接字的應(yīng)用提供了理論和實(shí)踐支持。

關(guān)鍵字:Socket通信 ?多線程Socket ?心跳機(jī)制 ?長(zhǎng)連接

中文分類號(hào):TP39文獻(xiàn)標(biāo)識(shí)碼: A ? ? ? ? ? 文章編號(hào)

Research on Socket Programming

XU Hongli 1 ?YANG Chuandong 1 ? WANG Xiuli

(1. College of Information Science and Engineering, Shandong Agricultural University, Taian, Shandong Province, 271018China)

Abstract: Socket is a common technology in network communication and has a wide prospect and significance in application. This paper first introduces the meaning of Socket, then pays attention to the precautions in the process of Socket communication, common Socket methods and multi-threaded Socket communication, and finally studies the Socket heartbeat mechanism, design ideas and precautions, Socket long connection and common steps, which provides theoretical and practical support for the application of Socket.

Key Words: Socket communication; MultithreadingSocket; Heartbeat mechanism; Long connection

1 什么是socket

Socket直譯為“插座,燈座”,又稱為“套接字”或“套接口”,最早由加州大學(xué)伯克利分校為UNIX系統(tǒng)開發(fā)出來(lái),目前是互聯(lián)網(wǎng)連接的標(biāo)準(zhǔn)接口[1]。它是網(wǎng)絡(luò)通信中應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。網(wǎng)絡(luò)中,兩個(gè)進(jìn)程通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)交換,這個(gè)雙向連接的一端稱為一個(gè)socket。socket遵循著“打開—讀/寫—關(guān)閉”模式,服務(wù)器和客戶端各自維護(hù)一個(gè)"文件",在建立連接打開后,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。Os會(huì)分配一個(gè)獨(dú)一無(wú)二的號(hào)給每個(gè)本地Socket,一個(gè)完整的Socket需要給出以下幾個(gè)方面的信息:協(xié)議、本地地址和遠(yuǎn)程地址、本地端口和遠(yuǎn)程端口。

目前,套接字分為SOCK_STREAM、SOCK_DGRAM及SOCK-ORIGINAL。需要注意的是在網(wǎng)絡(luò)通信中,兩個(gè)需要通訊的進(jìn)程最基本的一個(gè)前提是能夠唯一的標(biāo)志進(jìn)程,在本地進(jìn)程通訊中使用PID來(lái)唯一標(biāo)示一個(gè)進(jìn)程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個(gè)進(jìn)程PID沖突幾率很大。需要其他的輔助標(biāo)注信息。由于網(wǎng)絡(luò)中IP層的IP地址可以唯一標(biāo)示主機(jī),而TCP層協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程,因此利用“IP地址+協(xié)議+端口號(hào)”能夠唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程。另外,還提供心跳機(jī)制來(lái)判斷網(wǎng)絡(luò)連接是否類實(shí)時(shí)有效。能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后,它們就可以利用Socket進(jìn)行通信了,常用的有多線程Socket通訊和心跳機(jī)制。

2 Socket常用方法和多線程Socket編程

2.1 Socket 常用方法:

在.net中與socket編程有關(guān)的命名空間有System::Net,她為當(dāng)前網(wǎng)絡(luò)中使用的多種協(xié)議提供了簡(jiǎn)單的變成接口。System::Net:Sockets命名空間提供了需要嚴(yán)格掌控網(wǎng)絡(luò)通信的編程接口。常用的相關(guān)類:IPAddress類:包含一個(gè)IP地址。IPEndPoint類:包含了一對(duì)IP地址和端口號(hào)。常用方法:Socket()方法創(chuàng)建一個(gè)Socket。Bind():綁定一個(gè)本地的IP和端口號(hào)。Listen():讓Socket偵聽傳入的連接嘗試。Connect()初始化與另一個(gè)Socket的連接。Accept():接收連接并返回一個(gè)新的Socket。Send():輸出數(shù)據(jù)到Socket。Receive():從Socket中讀取數(shù)據(jù)。Close():關(guān)閉Socket,銷毀連接。

2.1多線程socket編程

對(duì)于同一個(gè)程序,它又可以分成若干個(gè)獨(dú)立的執(zhí)行流,即線程,線程提供了多任務(wù)處理的能力。利用多線程Socket編程可以在局域網(wǎng)內(nèi)實(shí)現(xiàn)多個(gè)IP的信息通信[2]。此時(shí),服務(wù)器端接收所有局域網(wǎng)內(nèi)客戶端發(fā)來(lái)的信息,并將此信息轉(zhuǎn)發(fā)給其他所有的客戶端。采用多線程實(shí)現(xiàn)局域網(wǎng)內(nèi)每個(gè)在線客戶端的信息監(jiān)聽??蛻舳私邮辗?wù)器發(fā)來(lái)的信息,或發(fā)送信息給服務(wù)器,再有服務(wù)器轉(zhuǎn)發(fā)給其他在線客戶端。具體實(shí)現(xiàn)時(shí),多線程socket常使用createthread創(chuàng)建n個(gè)線程,然后每個(gè)線程體創(chuàng)建使用單獨(dú)的socket。關(guān)于多線程編程,涉及的內(nèi)容很多,如線程間的通訊、線程間的同步等,注意事項(xiàng)如下。(1)與N個(gè)客戶端相連的話;服務(wù)器都有一個(gè)對(duì)應(yīng)的socket;也就是N個(gè)。(2)TCP的C/S應(yīng)用中,server端程序要先于client端程序執(zhí)行,原因是客戶端要連接服務(wù)器之前需要獲得服務(wù)器的IP地址和端口號(hào),這兩個(gè)信息是出于監(jiān)聽狀態(tài)的,如果服務(wù)器不先啟動(dòng),也不可能綁定這個(gè)端口號(hào),因此客戶端根本連接不上。(3)各個(gè)線程可以訪問(wèn)進(jìn)程中的公共變量,需要做數(shù)據(jù)保護(hù),以免損壞數(shù)據(jù)。保證各個(gè)線程在一起適當(dāng)協(xié)調(diào)工作稱為線程之間的同步。即要處理數(shù)據(jù)的并發(fā)控制和同步問(wèn)題[3]。Visual C++提供多線程同步類:同步對(duì)象(CsyncObject、Csemaphore、Cmutex、CcriticalSection和Cevent)和同步訪問(wèn)對(duì)象(CmultiLock和CsingleLock),保證程序運(yùn)行安全性和數(shù)據(jù)有效性。

3 套接字心跳機(jī)制和長(zhǎng)連接

3.1 心跳機(jī)制設(shè)計(jì)思路

網(wǎng)絡(luò)通信,當(dāng)客戶端連接服務(wù)器,服務(wù)器會(huì)維持一個(gè)跟客戶端相關(guān)的Socket。心跳包是為了服務(wù)器和客戶端獲知對(duì)方是否處于在線狀態(tài)的數(shù)據(jù)包,一般按照設(shè)定的時(shí)間間隔發(fā)送,像心跳,因此稱為心跳包[4]。為節(jié)省服務(wù)器端資源,客戶端停止程序之前,會(huì)發(fā)“停止”通知到服務(wù)器端,以便釋放相應(yīng)內(nèi)存資源。但由于網(wǎng)絡(luò)環(huán)境的復(fù)雜,會(huì)出現(xiàn)客戶端已中斷,服務(wù)器端還未獲知的情況,如病毒、防火墻、未知的網(wǎng)絡(luò)故障等,因此采用心跳機(jī)制判斷服務(wù)器和客戶端否掉線,之所以不直接判斷Socket內(nèi)容,是因?yàn)榫W(wǎng)絡(luò)上有很多緩存設(shè)備,緩存的時(shí)間不等(從幾秒到幾分鐘不等),不易直接采用[5]。

需要注意的是,TCP協(xié)議中的SO_KEEPALIVE選項(xiàng),可以設(shè)置心跳頻率,默認(rèn)為2h,如果通過(guò)此選項(xiàng)更改心跳頻率,則約束所有的網(wǎng)絡(luò)通信。因此,通常在應(yīng)用層項(xiàng)目的應(yīng)用程序中編寫“心跳包”來(lái)完成此功能,設(shè)計(jì)思想如下。(1)客戶端每隔一定時(shí)間間隔(如30s)發(fā)送心跳包給服務(wù)器端,并累加計(jì)數(shù)1次,服務(wù)器收到心跳包后把信息返回給客戶端。(2)若服務(wù)器將心跳信息正常發(fā)回,則客戶端計(jì)數(shù)清零。(3)發(fā)生網(wǎng)絡(luò)不暢時(shí),要么規(guī)定時(shí)間內(nèi)(如30s)客戶端收不到服務(wù)器端發(fā)回的消息,則客戶端關(guān)閉相應(yīng)的連接;要么服務(wù)器端檢查所有的連接商定時(shí)間內(nèi)是否收到心跳包,若無(wú)則說(shuō)明客戶端出現(xiàn)問(wèn)題,關(guān)閉相應(yīng)的socket。(4)如必要,可以自定義structure為心跳包或心跳幀,使對(duì)方獲悉本方的online狀態(tài),以延續(xù)連接的有效性。其內(nèi)容有些無(wú)關(guān)緊要,可以很小,甚至可以是一個(gè)空包,僅僅包含包頭部分。

3.2Socket長(zhǎng)連接

Socket長(zhǎng)連接建立在心跳機(jī)制之上,即建立長(zhǎng)連接一般需要設(shè)置心跳機(jī)制做其Prepare工作,長(zhǎng)連接的?;睿↘eepAlive)性需要應(yīng)用層的心跳機(jī)制的保證[6]。長(zhǎng)連接是相對(duì)短連而言,根據(jù)通信時(shí)發(fā)送的數(shù)據(jù)包多少和連接保持的在線長(zhǎng)短及連接數(shù)等確定。一般用于操作多,保持在線時(shí)間長(zhǎng)的情況。比如數(shù)據(jù)庫(kù)的連接一般使用長(zhǎng)連接更高效,因?yàn)槊看蜹CP的連接都需要按照流程中的三步走執(zhí)行,對(duì)數(shù)據(jù)庫(kù)進(jìn)行頻繁的連接會(huì)降低效率并增加網(wǎng)絡(luò)通信的占用時(shí)間,浪費(fèi)通信資源的同時(shí)大大拉低數(shù)據(jù)庫(kù)的工作速度,數(shù)據(jù)庫(kù)連接一般是長(zhǎng)連接,第一個(gè)數(shù)據(jù)包傳送后,連接不斷開,接著進(jìn)行后續(xù)包的傳遞。

TCP連接保持期間,需要注意無(wú)內(nèi)容傳送時(shí),為延續(xù)此連接,兩方需要有檢測(cè)包(心跳包)的通信。即通常情況下長(zhǎng)連接的步驟為“connection→data transmission→keep connection(Transmit heartbeat package)→data transmission→keep connection(transmit heartbeat package)→……→shutdown the connection”。心跳機(jī)制與服務(wù)器和客戶端是同步還是異步的收發(fā)方式無(wú)關(guān),即無(wú)論是雙方同步通信還是異步通信,上述長(zhǎng)連接和心跳包處理策略都適應(yīng)。

3.3 WebSocket技術(shù)

網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,對(duì)實(shí)時(shí)通信的需求越來(lái)越高,WebSocket技術(shù)應(yīng)運(yùn)而生[7]。與Socket不同,它處于應(yīng)用層,從根上來(lái)說(shuō)是基于TCP協(xié)議的,從這點(diǎn)上與HTTP相同,是對(duì)TCP協(xié)議的封裝。WebSocket依賴于HTTP協(xié)議首次握手,成功后,數(shù)據(jù)從TCP通道進(jìn)行全雙工通信傳送,即服務(wù)器端能夠主動(dòng)推送數(shù)據(jù)到客戶端,簡(jiǎn)化了通信過(guò)程,握手成功后就不再依賴于HTTP。與Socket相比,WebSocket在具體使用中更加便捷、易用,因?yàn)樗峭暾奶幱趹?yīng)用層的協(xié)議,帶有保準(zhǔn)的API部分,而Socket是應(yīng)用從和TCP/IP協(xié)議的中間接口,從而屏蔽TCP/IP協(xié)議的復(fù)雜性,靈活性上,Socket優(yōu)于WebSocket,但嚴(yán)格意義上,Socket不是協(xié)議,是應(yīng)用層與TCP/IP的中間層軟件抽象。它易于按照既定協(xié)議組織數(shù)據(jù)。

4 總結(jié)

Socket只是對(duì)TCP/IP協(xié)議棧操作的抽象,實(shí)際應(yīng)用中,套接字在網(wǎng)絡(luò)通信中占有重要的地位,在網(wǎng)絡(luò)應(yīng)用方面有著廣泛的應(yīng)用前景和意義。本文研究了幾種不同的Socket理論和編程,包括多線程Socket通信、套接字心跳機(jī)制、Socket長(zhǎng)連接、WebSocket等,并給出了Socket編程過(guò)程中的注意事項(xiàng),特別是心跳機(jī)制和Socket長(zhǎng)連接的設(shè)計(jì)思想和實(shí)踐中的注意問(wèn)題,從而為套接字的應(yīng)用提供技術(shù)支持。

參考文獻(xiàn)

[1] 孫龍,溫建新,馬凱.基于海洋網(wǎng)絡(luò)信息體系的自適應(yīng)接口技術(shù)[J]中國(guó)電子科學(xué)研究院學(xué)報(bào).2021,16(9):7-39

[2]李浩浩.基于深度學(xué)習(xí)的可回收垃圾視覺(jué)分揀系統(tǒng)[D].西安:西安理工大學(xué),2021

[3] 王宏旭,吳小欣,黃杰.SOCKET編程實(shí)現(xiàn)局域網(wǎng)計(jì)算機(jī)監(jiān)控管理分析[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2012(8):206-20

[4] Amit Arvind Agrawal. Fate of root shell after pontic/socket shield techniques,is it better to extract the whole tooth?[J] World Journal of Meta-Analysis.2021,9(4):333-341

[5]蘇俊維.OpenWrt智能路由器在中小型規(guī)模智慧農(nóng)業(yè)中的應(yīng)用[J].科學(xué)技術(shù)創(chuàng)新,2021(11):96-97

[6] 胡長(zhǎng)鵬,馬海霞,林思敏,等.一種基于WiFi無(wú)線通訊的智能插座設(shè)計(jì)與實(shí)現(xiàn)[J].機(jī)電工程技術(shù),2021,50(8):70-73

[7]梁靜.微服務(wù)框架下敏感信息的交叉跨域安全通信技術(shù)研究[D].成都:四川師范大學(xué),2020

2747501186386

猜你喜歡
端口號(hào)應(yīng)用層服務(wù)器端
在Docker容器中安裝應(yīng)用程序
淺析異步通信層的架構(gòu)在ASP.NET 程序中的應(yīng)用
成功(2018年10期)2018-03-26 02:56:14
淺談以java為基礎(chǔ)的Socket通信簡(jiǎn)介及實(shí)現(xiàn)
青春歲月(2017年5期)2017-04-20 18:34:23
基于分級(jí)保護(hù)的OA系統(tǒng)應(yīng)用層訪問(wèn)控制研究
新一代雙向互動(dòng)電力線通信技術(shù)的應(yīng)用層協(xié)議研究
在Windows中安裝OpenVPN
物聯(lián)網(wǎng)技術(shù)在信息機(jī)房制冷系統(tǒng)中的應(yīng)用
Winsock編程在《計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)》教學(xué)中的應(yīng)用
基于Android系統(tǒng)的互動(dòng)展示APP的研究與設(shè)計(jì)
Current advances in neurotrauma research: diagnosis, neuroprotection, and neurorepair
昭平县| 大英县| 曲阜市| 丁青县| 潢川县| 安阳市| 盐津县| 汝州市| 武强县| 长岭县| 德州市| 吉隆县| 玉树县| 广德县| 华蓥市| 东方市| 瓮安县| 威远县| 醴陵市| 鄢陵县| 肥城市| 正蓝旗| 甘洛县| 金溪县| 庆元县| 兴隆县| 靖西县| 新民市| 巫溪县| 曲沃县| 石泉县| 芮城县| 五家渠市| 寿宁县| 资阳市| 宣武区| 即墨市| 金堂县| 惠东县| 平江县| 浦城县|