导航:首页 > 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相关的知识