導航:首頁 > IDC知識 > 伺服器長連接c

伺服器長連接c

發布時間:2021-03-10 20:26:43

1、一台客戶端可以與多台伺服器保持長連接嗎?

正常情況沒有限制,只要客戶端配置夠高。長時間連接,間隔一段時間自動斷開,可能是網路問題導致或者是本地網路設備問題。可以嘗試使用另一台作為終端來連接到伺服器端。

2、如何實現android和伺服器的長連接?

轉載 這種功能實際上就是數據同步,同時要考慮手機本身、電量、網路流量等等限制因素,所以通常在移動端上有一下兩個解決方案:

1.一種是定時去server查詢數據,通常是使用HTTP協議來訪問web伺服器,稱Polling(輪詢);

2.還有一種是移動端和伺服器建立長連接,使用XMPP長連接,稱Push(推送)。

從耗費的電量、流量和數據延遲性各方面來說,Push有明顯的優勢。但是使用Push的缺點是:

對於客戶端:實現和維護相對成本高,在移動無線網路下維護長連接,相對有一些技術上的開發難度。

對於伺服器:如何實現多核並發,cpu作業調度,數量龐大的長連接並發維護等技術,仍存在開發難點。

在講述Push方案的原理前,我們先了解一下移動無線網路的特點。

移動無線網路的特點:

因為 IP v4 的 IP 量有限,運營商分配給手機終端的 IP 是運營商內網的 IP,手機要連接 Internet,就需要通過運營商的網關做一個網路地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關需要維護一個外網 IP、埠到內網 IP、埠的對應關系,以確保內網的手機可以跟 Internet 的伺服器通訊

GGSN(Gateway GPRS

Support Node 網關GPRS支持結點)模塊就實現了NAT功能。

因為大部分移動無線網路運營商都是為了減少網關的NAT映射表的負荷,所以如果發現鏈路中有一段時間沒有數據通訊時,會刪除其對應表,造成鏈路中斷。(關於NAT的作用及其原理可以查看我的另一篇博文:關於使用UDP(TCP)跨區域網,NAT穿透的心得)

Push在Android平台上長連接的實現:

既然我們知道我們移動端要和Internet進行通信,必須通過運營商的網關,所以,為了不讓NAT映射表失效,我們需要定時向Internet發送數據,因為只是為了不然NAT映射表失效,所以只需發送長度為0的數據即可。

這時候就要用到定時器,在android系統上,定時器通常有一下兩種:

1.java.util.Timer

2.android.app.AlarmManager

分析:

Timer:可以按照計劃或者時間周期來執行相關的任務。但是Timer需要用WakeLock來讓CPU保持喚醒狀態,才能保證任務的執行,這樣子會消耗大量流量;當CPU處於休眠的時候,就不能喚醒執行任務,所以應用於移動端明顯是不合適。

AlarmManager:AlarmManager類是屬於android系統封裝好來管理RTC模塊的管理類。這里就涉及到RTC模塊,要更好地了解兩者的區別,就要明白兩者真正的區別。

RTC(Real- Time Clock)實時鬧鍾在一個嵌入式系統中,通常採用RTC

來提供可靠的系統時間,包括時分秒和年月日等;而且要求在系統處於關機狀態下它也能夠正常工作(通常採用後備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768KHz

晶體和電阻電容等。(如果對這方面感興趣,可以自己查閱相關資料,這里就說個大概)

好了,回來正題。所以,AlarmManager又稱全局定時鬧鍾。這意味著,當我用使用AlarmManager來定時執行任務,CPU可以正常地休眠,只有在執行任務是,才喚醒CPU,這個過程是很短時間的。

下面簡單來說明其使用:

1.類似於Timer功能:

//獲得鬧鍾管理器

AlarmManager

am = (AlarmManager)getSystemService(ALARM_SERVICE);

//設置任務執行計劃

am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000,

sender);//從firstTime才開始執行,每隔5秒再執行

2.實現全局定時功能:

//獲得鬧鍾管理器

AlarmManager

am = (AlarmManager)getSystemService(ALARM_SERVICE);

//設置任務執行計劃

am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,

5*1000, sender);//從firstTime才開始執行,每隔5秒再執行

總結:在android客戶端使用Push推送時,應該使用AlarmManager來實現心跳功能,使其真正實現長連接。

3、用php如何實現與c服務的長連接

鑒於 php 的運行機制,可以通過自己編寫擴展函數,實現類似於 mysql_pconnect 形式的調用,從而滿足這種需求

4、一台伺服器可以連接多少個tcp長連接

TCP是一種通訊協議,用於交換數據,如QQ有時就用TCP連接.SMTP伺服器就是郵件伺服器,smtp協議用來發郵件,pop3用來接受郵件.

5、ningx伺服器怎麼保證長連接

這種功能實際上就是數據同步,同時要考慮手機本身、電量、網路流量等等限制因素,所以通常在移動端上有一下兩個解決方案:1.一種是定時去server查詢數據,通常是使用HTTP協議來訪問web伺服器,稱Polling(輪詢);2.還有一種是移動端和伺服器建立長連接,使用XMPP長連接,稱Push(推送)。從耗費的電量、流量和數據延遲性各方面來說,Push有明顯的優勢。但是使用Push的缺點是:對於客戶端:實現和維護相對成本高,在移動無線網路下維護長連接,相對有一些技術上的開發難度。對於伺服器:如何實現多核並發,cpu作業調度,數量龐大的長連接並發維護等技術,仍存在開發難點。在講述Push方案的原理前,先了解一下移動無線網路的特點。移動無線網路的特點:因為 IP v4 的 IP 量有限,運營商分配給手機終端的 IP 是運營商內網的 IP,手機要連接 Internet,就需要通過運營商的網關做一個網路地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關需要維護一個外網 IP、埠到內網 IP、埠的對應關系,以確保內網的手機可以跟 Internet 的伺服器通訊GGSN(Gateway GPRS Support Node 網關GPRS支持結點)模塊就實現了NAT功能。因為大部分移動無線網路運營商都是為了減少網關的NAT映射表的負荷,所以如果發現鏈路中有一段時間沒有數據通訊時,會刪除其對應表,造成鏈路中斷。Push在Android平台上長連接的實現:既然自己知道自己移動端要和Internet進行通信,必須通過運營商的網關,所以,為了不讓NAT映射表失效,咋們需要定時向Internet發送數據,因為只是為了不然NAT映射表失效,所以只需發送長度為0的數據即可。這時候就要用到定時器,在android系統上,定時器通常有一下兩種:1.java.util.Timer2.android.app.AlarmManager分析:Timer:可以按照計劃或者時間周期來執行相關的任務。但是Timer需要用WakeLock來讓CPU保持喚醒狀態,才能保證任務的執行,這樣子會消耗大量流量;當CPU處於休眠的時候,就不能喚醒執行任務,所以應用於移動端明顯是不合適。AlarmManager:AlarmManager類是屬於android系統封裝好來管理RTC模塊的管理類。這里就涉及到RTC模塊,要更好地了解兩者的區別,就要明白兩者真正的區別。RTC(Real- Time Clock)實時鬧鍾在一個嵌入式系統中,通常採用RTC 來提供可靠的系統時間,包括時分秒和年月日等;而且要求在系統處於關機狀態下它也能夠正常工作(通常採用後備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768KHz 晶體和電阻電容等。(如果對這方面感興趣,可以自己查閱相關資料,這里就說個大概)好了,回來正題。所以,AlarmManager又稱全局定時鬧鍾。這意味著,當自己用使用AlarmManager來定時執行任務,CPU可以正常地休眠,只有在執行任務是,才喚醒CPU,這個過程是很短時間的。下面簡單來說明其使用:1.類似於Timer功能://獲得鬧鍾管理器AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);//設置任務執行計劃am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender);//從firstTime才開始執行,每隔5秒再執行2.實現全局定時功能://獲得鬧鍾管理器AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);//設置任務執行計劃am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);//從firstTime才開始執行,每隔5秒再執行總結:在android客戶端使用Push推送時,應該使用AlarmManager來實現心跳功能,使其真正實現長連接。

6、伺服器端 長連接 客戶端要使用什麼連接

我們有時候有這種需求,即我們的android客戶端要始終保持與服務端的連接,當服務端有任務或消息發送到android客戶端的時候就發送,沒有任務或消息的時候不發送但要保持這個連接,一旦有任務則開發發送,而我們的android客戶端則要保持一個時刻接收任務或消息的狀態。。。這個時候我們通過socket來實現這種需求【當然你也可以採用http輪詢的方式來不斷的從客戶端個請求服務端,這樣做有一定的弊端】
實現原理:
1:android客戶端通過service在後台通過servreScoket不斷的accept,一旦有相應的socket到達,則啟動一個線程去處理
2::在線程中處理完返回給我們android客戶端的消息或任務之後,要將這種結果表現在ui上,這個步驟方法就比較多了,例如你可以發一個廣播來通知ui,或者你可以通過一個static的handler來處理

7、如何實現單伺服器300萬個長連接的

不是吹牛,理論上完全可以達到。
(以下參考值皆是Linux平台上)

1,Linux單個進程可以維持的連接數(fd)理論值是通過ulimit -a設置,或在server內使用setrlimit()設置,具體最大是多少?我看我的64機上是64bits的一個數值,所以,權且認為理論上是2^64-1。 anyway,幾百萬不是問題。

2,TCP連接數。因為是Server端,不用向系統申請臨時埠,只佔fd資源。所以tcp連接數不受限制。

3,維持連接當然需要內存消耗,假如每個連接(fd),我們為其分配5k位元組(應該足夠了,就存放一些用戶信息之類的)。這樣是5k*3000000=15G。 文中有24G內存,應該也足夠了。

================================
下面我們說下文中提及的 多消息循環、非同步非阻塞。
先說非同步和非阻塞吧。權且認為這倆是一個概念。都是指的IO的非同步和非阻塞。
1,非同步+非阻塞的話,Linux上必然是epoll了。
原理上簡而言之吧,非同步就是基於事件的讀寫,epoll同時監聽所有的tcp連接(fd),當有哪些連接上有了事件(讀、寫、錯誤),就返回有事件的連接集合,然後處理這個集合里的需要處理的連接事件。這兒就是基於事件的非同步IO。
非阻塞。 在得到有事件的tcp連接集合之後,逐一進行讀(寫)。分開來說,需要讀的fd,其實數據已經到OS的tcp buffer里了,讀完直接返回,CPU不等待。(返回EAGAIN,其實就進行了幾次memcpy); 需要寫的連接,同樣,其實是把數據寫到了OS的tcp buffer里,寫滿為止。。不會等待對方發來ACK再返回。這樣,其實這里CPU基本上只進行了一些memcpy的操作。。即便同時幾十萬連接有事件,也是瞬間處理完的事。。。然後,CPU再進行非同步io等待(epoll_wait())。
當然這兒要充分利用多核,最好將io線程和work線程分開。

2,多消息循環。。這個應該是他們內部的概念。我個人猜測是非同步的消息協議。
舉例子,傳統的TCP連接是一問一答,如HTTP。

8、PHP如何實現長連接??用C實現了通信的伺服器端,現在想用php編寫能實時接收消息的客戶端。希望大神指點

用socket類就行了。

9、TCP伺服器最大能支持多少長連接

一個老生常談的問題,本以為網上能搜索到很滿意的答案,但結果很不盡人意,於是自己寫下測試程序,好好測試下;

測試用例

伺服器、客戶端都在一台電腦上,伺服器採用IOCP,客戶端普通的socket,創建、連接、發送、接收,但不關閉,循環100000次,每次SLEEP(1),
測試環境:WIN XP 32
客戶端在第13400左右次連接伺服器失敗;關閉客戶端聯系做了50次類似測試,伺服器內存在10多M,慢慢增加至100M左右內存時,內存自動回收,按每次客戶端連接成功4000次計算,可以連接成功20w次。(昨天測試結果,未完待續。。。)

測試環境:WIN SERVER 2003 64
單一客戶端(64)在44449次時連接失敗,同時啟動2個客戶端,分別在3w多次連接失敗。

10、如何實現android和伺服器長連接

轉載 這種功能實際上就是數據同步,同時要考慮手機本身、電量、網路流量等等限制因素,所以通常在移動端上有一下兩個解決方案:
1.一種是定時去server查詢數據,通常是使用HTTP協議來訪問web伺服器,稱Polling(輪詢);
2.還有一種是移動端和伺服器建立長連接,使用XMPP長連接,稱Push(推送)。

從耗費的電量、流量和數據延遲性各方面來說,Push有明顯的優勢。但是使用Push的缺點是:
對於客戶端:實現和維護相對成本高,在移動無線網路下維護長連接,相對有一些技術上的開發難度。
對於伺服器:如何實現多核並發,cpu作業調度,數量龐大的長連接並發維護等技術,仍存在開發難點。

在講述Push方案的原理前,我們先了解一下移動無線網路的特點。
移動無線網路的特點:
因為 IP v4 的 IP 量有限,運營商分配給手機終端的 IP 是運營商內網的 IP,手機要連接 Internet,就需要通過運營商的網關做一個網路地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關需要維護一個外網 IP、埠到內網 IP、埠的對應關系,以確保內網的手機可以跟 Internet 的伺服器通訊
GGSN(Gateway GPRS
Support Node 網關GPRS支持結點)模塊就實現了NAT功能。
因為大部分移動無線網路運營商都是為了減少網關的NAT映射表的負荷,所以如果發現鏈路中有一段時間沒有數據通訊時,會刪除其對應表,造成鏈路中斷。(關於NAT的作用及其原理可以查看我的另一篇博文:關於使用UDP(TCP)跨區域網,NAT穿透的心得)

Push在Android平台上長連接的實現:
既然我們知道我們移動端要和Internet進行通信,必須通過運營商的網關,所以,為了不讓NAT映射表失效,我們需要定時向Internet發送數據,因為只是為了不然NAT映射表失效,所以只需發送長度為0的數據即可。

這時候就要用到定時器,在android系統上,定時器通常有一下兩種:
1.java.util.Timer
2.android.app.AlarmManager

分析:
Timer:可以按照計劃或者時間周期來執行相關的任務。但是Timer需要用WakeLock來讓CPU保持喚醒狀態,才能保證任務的執行,這樣子會消耗大量流量;當CPU處於休眠的時候,就不能喚醒執行任務,所以應用於移動端明顯是不合適。

AlarmManager:AlarmManager類是屬於android系統封裝好來管理RTC模塊的管理類。這里就涉及到RTC模塊,要更好地了解兩者的區別,就要明白兩者真正的區別。
RTC(Real- Time Clock)實時鬧鍾在一個嵌入式系統中,通常採用RTC
來提供可靠的系統時間,包括時分秒和年月日等;而且要求在系統處於關機狀態下它也能夠正常工作(通常採用後備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768KHz
晶體和電阻電容等。(如果對這方面感興趣,可以自己查閱相關資料,這里就說個大概)
好了,回來正題。所以,AlarmManager又稱全局定時鬧鍾。這意味著,當我用使用AlarmManager來定時執行任務,CPU可以正常地休眠,只有在執行任務是,才喚醒CPU,這個過程是很短時間的。
下面簡單來說明其使用:
1.類似於Timer功能:
//獲得鬧鍾管理器
AlarmManager
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//設置任務執行計劃
am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000,
sender);//從firstTime才開始執行,每隔5秒再執行

2.實現全局定時功能:
//獲得鬧鍾管理器
AlarmManager
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//設置任務執行計劃
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
5*1000, sender);//從firstTime才開始執行,每隔5秒再執行

總結:在android客戶端使用Push推送時,應該使用AlarmManager來實現心跳功能,使其真正實現長連接。

與伺服器長連接c相關的知識