问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何建立"socket"连接?4

发布网友 发布时间:2023-10-14 14:07

我来回答

1个回答

热心网友 时间:2024-10-25 09:34

一般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 < 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();//释放资源
return null;
}
当数据发送完毕后,程序必须将m_isFree 设置为 False。否则只使用不释放,程序很 快就溢出了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
物流师证书就业前景 大话西游之战歌,齐天小圣,能吃几个1000年的蟠桃,才能变摸样? 高手们啊... 大话西游外传刚上来怎么就给的齐天小圣是紫色品阶的 大话西游之战歌。齐天小圣怎嘛打技能 大话西游外传怎么获得变色齐天小圣 大话西游外传领变异齐天小圣的是什么序列号 如何设置代理服务器(如何设置代理服务器地址) 家庭劳动有什么? ...和“而” 字的 用法 比如想介词啦 并想用学而实习之 之和而中点一... 铜陵职业技术学院是什么类别的学校 什么是socket,C中的socket怎么用?7 在C#编程中,socket.Bind()和Socket.Co...1 使用socketconnection进行连接,可不知为什么连...5 什么是工作规划要点?4 如何做好仓库存储的方案设计1 一个手机号能申请两个吗? 在Microsoft Excel中怎么算相乘158 中华第一县是指哪里?23 中华第一县是那个县?10 中国有几个华夏第一县?357 力帆520换电瓶需要多少钱1 华夏第一镇是哪个省哪个哪个县? 好看的国产战争片17 假设某台式计算机内存储器的容量为1KB,其最后一个字节的地址...110 坐杭州公交车被公交车司机要求检查背包,我的权利是否被侵犯?5 拯救者笔记本键盘突然失灵7 LG电视机黑屏怎么解决? 急啊 各位高手帮帮忙!!!47 “性格决定命运”最早说出这句名言的是谁?1 “习惯形成性格,性格决定命运。——约&#8226;凯恩斯”,...2 习惯形成性格,性格决定命运。到底是杰克.霍吉说的,还是约·凯...2 dcomconnection,adoconnection,s... 为什么桌面上的IE图标删不掉93 powerpoint2007下载11 LG电视突然黑屏64 液晶电视LG出现黑屏但是还有声,什么原因21 如何做好仓库存储的方案设计1 仓储管理规划方案怎么写6 杭州公交车司机的待遇?25 outlook 无法连接到服务器36 outlook设置没有问题,但是连接不上邮件服务器。23 中国第一工业大省是哪个省?第一大市是哪个市?第一大县是哪个县...16 杭州公交车驾驶员的工资是多少49 为什么现在杭州公交车都要检查行李?杭州公交司机好这口么? 砍的部首和结构 父母都没有鱼鳞病,为什么孩子会得这个病1 王者荣耀,血王宫回忆怎么同时保护孙膑和钟无艳。596 希特林缺陷长大了有么的影响18 情侣网名。女牧羊人男什么名字?1 ...病就叫神婆,什么中邪,感觉好讨厌,总是信外面算命的, 符合天边牧羊人的情侣网名