- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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= “”; 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 200 ; 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 m_socket.Length ; i ++) { if(m_socket[i].m_isFree) //如果找到一个空闲的 { m_socket[i].m_isFree = false; m_mutex.ReleaseMutex();//释放资源 return m_socket[i]; } } //如果没有空闲的链接,要么等待,要么程序再动态创建一个链接。 m_mutex.ReleaseMutex();//释放资源
有哪些信誉好的足球投注网站
文档评论(0)