本文目录一览:
如何建立"socket"连接?
一般socket链接有以下两种方式:长(常)链接和短链接。
长链接:当数据发送完成后socket链接不断开。一直保留到异常或者是程序退出为止 ,这种方式的好处是不用每次去发起连接断开,在速度上可以比短连接要快一些,但是相 对来说对服务器的资源压力也要大些。长链接用的范围很广,比如游戏系统,qq等等,长 (常)链接一般还需要定时向服务器ping数据,以保证socket链接畅通。当ping不通服务 器时,需要重新开启链接。
短链接:当一次数据发送完毕后,主动断开链接,每次发送数据都要一次链接、断开 操作,这种方式的好处是:对服务器的资源占用相对来说比较小,但是由于每次都要重新 链接,速度开销上也比较大,这种方式对于那种不需要经常与服务器交互的情况下比较适 用。
上面两种方法在用户量非常大的情况下都存在着很大的不足,因此,考虑可以用 一种折衷的办法,那就是使用socket的连接池。
程序一开始初始化创建若干数量的长链接。给他们设置一个标识位,这个标识位表示 该链接是否空闲的状态。当需要发送数据的时候,系统给它分配一个当前空闲的链接。同 时,将得到的链接设置为“忙”,当数据发送完毕后,把链接标识位设置为 “闲”,让系统可以分配给下个用户,这样使得两种方式的优点都充分的发挥 出来了。用户数量足够多的时候,只需要动态增加链接池的数量即可。
下面我们用具体的程序来讲解下:
首先声明一个socket类:
public class XieGouSocket
{
public Socket m_socket; //Socket对象
public bool m_isFree; //判断是否空闲
public int m_index; //在链接缓存池中的索引值
}
下面的函数是创建socket链接池,这里为了使代码更加清晰,特地把异常处理部分 全部取掉了。
public XieGouSocket[] m_socket; //先定义个缓冲池
public void CreateSocketPool()
{
string ip= “127.0.0.1”;
string port= 2003;
IPAddress serverIp=IPAddress.Parse(ip);
int serverPort=Convert.ToInt32(port);
IPEndPoint iep=new IPEndPoint(serverIp,serverPort);
m_socket = new XieGouSocket[200];
for(int i =0; i {
m_socket[i] = new XieGouSocket();
m_socket[i].m_index = i ;
m_socket[i].m_isFree = true;
m_socket[i].m_socket =new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
m_socket[i].m_socket.SetSocketOption (SocketOptionLevel.Socket,SocketOptionName.SendTimeout,1000);
m_socket[i].m_socket.Connect(iep);
}
}
下面的函数是获取当前空闲的socket链接:
因为是多线程,所以需要加一个原子操作,定义一个原子变量,以防止多个线程 之间抢占资源问题的发生。
private static Mutex m_mutex=new Mutex();
public static XieGouSocket GetFreeConnection()
{
m_mutex.WaitOne(); //先阻塞
for(int i =0; i {
if(m_socket[i].m_isFree) //如果找到一个空闲的
{
m_socket[i].m_isFree = false;
m_mutex.ReleaseMutex();//释放资源
return m_socket[i];
}
}
//如果没有空闲的链接,要么等待,要么程序再动态创建一个链接。
m_mutex.ReleaseMutex();//释放资源
return null;
}
当数据发送完毕后,程序必须将m_isFree 设置为 False。否则只使用不释放,程序很 快就溢出了。
php如何实现长链接,用什么
因为像普通的php脚本应用是用来接受一个HTTP请求(经由apache得到请求),并返回一个html网页或者http特殊响应(经由apache发送)。而楼主则需要在一个php线程中接受大量的长时间连接。这样就需要php脚本本身长时间运行。因此可以用命令行模式(像这样)来运行脚本c:\\php5\\php.exe e:\\script\\main.php脚本中则可以使用set_time_limit(0);然后再创建socket对象,监听端口即可。这里唯一有的一个问题就是多线程。普通的网络应用程序服务器都是采用多线程来监听和处理用户连接的。php这里就可能会有不少的问题。你试试看这样行不行,你还不明白的话可以去后盾网去问问专家教师,他们一定会的,这样不就行了,如果嫌弃麻烦可以上后盾人,找找相关教材视频看看,不就会了,希望能帮到你,给个采纳吧谢谢
怎么建立socket长连接
本来socket建立后就是一直保持链接状态的,除非你close掉。可以在外部定义一个类,在当前activity链接socket,跳转到其他activity时,再用这个类获取之前链接的socket。
------解决方案--------------------------------------------------------
本来socket建立后就是一直保持链接状态的,除非你close掉。可以在外部定义一个类,在当前activity链接socket,跳转到其他activity时,再用这个类获取之前链接的socket。
php可不可以socket通信长连接,不断开,然后实现多次通讯?
理论上是可以的,使用PHP提供的socket相关API,主要问题是脚本执行时间。
PHP运行模式分为非命令行模式及命令行模式。
非命令行模式一般是用于B/S交互,max_execution_time默认为非零,也就是限制脚本执行时间。即使你设置max_execution_time为0也面临用户浏览器请求的超时问题。
命令行模式下set_limit_time默认为0,做为本地脚本执行,所以没有上述的问题。
PHP SOCKET相关文档: