⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 如何写一个稳定,高效的socket服务器程序。 _net技术 - c# - csdn社区 community_csdn_net.htm

📁 主要是我最近两月在公司通过百度学习的内容,有AJAX,DWR,JAVA实现文件的上传和下载.主要目的在与告诉大家一个成功程序员(JAVA)是如何学习的,需要学习什么内容.以及学习的态度.
💻 HTM
📖 第 1 页 / 共 4 页
字号:
Console.WriteLine(e.Message+","+sFileName); &nbsp; <BR>&nbsp; byOper = 
OPEN_FILE_FAILED; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
//组织回应命令 &nbsp; <BR>&nbsp; pos = 0; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
m_byte.SetWord(bSend,CMD_S_REQUERY,ref &nbsp; pos); &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; m_byte.SetByte(bSend,new &nbsp; byte[]{byOper},ref &nbsp; pos); 
&nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
theSockId.thisSocket.Send(bSend,0,pos,SocketFlags.None &nbsp; ); &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; else &nbsp; 
if(nCmd &nbsp; == &nbsp; CMD_C_DETAIL) //detail &nbsp; <BR>&nbsp; { &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; // Console.WriteLine("Recevied &nbsp; file &nbsp; 
detail &nbsp; info &nbsp; {0} &nbsp; times",nCurTime); &nbsp; <BR>&nbsp; // 
&nbsp; assert &nbsp; m_file &nbsp; is &nbsp; opened &nbsp; <BR>&nbsp; 
if(theSockId.m_file &nbsp; == &nbsp; null) &nbsp; <BR>&nbsp; return &nbsp; ; 
&nbsp; <BR>&nbsp; //close &nbsp; <BR>&nbsp; theSockId.nCurTime = 
m_byte.GetDword(theSockId.dataBuffer,ref &nbsp; pos); &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; theSockId.m_file.Write(theSockId.dataBuffer, &nbsp; pos,iRx &nbsp; - 
&nbsp; pos); &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; //每十个包保存一次 &nbsp; <BR>&nbsp; 
if((theSockId.nCurTime &nbsp; /10 &nbsp; ) &nbsp; == &nbsp; 0) &nbsp; <BR>&nbsp; 
//save &nbsp; <BR>&nbsp; theSockId.m_file.Flush(); &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; //组织回应命令 &nbsp; <BR>&nbsp; pos = 0; &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; m_byte.SetWord(bSend,CMD_S_DETAIL,ref &nbsp; pos); &nbsp; <BR>&nbsp; 
m_byte.SetDword(bSend,theSockId.nCurTime,ref &nbsp; pos); &nbsp; <BR>&nbsp; 
theSockId.thisSocket.Send(bSend,0,pos,SocketFlags.None); &nbsp; <BR>&nbsp; 
&nbsp; <BR>&nbsp; if( &nbsp; theSockId.nCurTime &nbsp; == &nbsp; 
theSockId.nTimes &nbsp; ) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; //save &nbsp; 
<BR>&nbsp; theSockId.m_file.Flush(); &nbsp; <BR>&nbsp; theSockId.m_file.Close(); 
&nbsp; <BR>&nbsp; theSockId.m_file = null; &nbsp; <BR>&nbsp; theSockId.nTimes = 
0; &nbsp; <BR>&nbsp; // sFileName= null; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; 
&nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; WaitForData(nIndex &nbsp; &nbsp; ); &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; // catch 
&nbsp; (ObjectDisposedException &nbsp; ) &nbsp; <BR>&nbsp; // { &nbsp; 
<BR>&nbsp; // System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: &nbsp; 
Socket &nbsp; has &nbsp; been &nbsp; closed\n"); &nbsp; <BR>&nbsp; // } &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; catch(SocketException &nbsp; se) &nbsp; <BR>&nbsp; 
{ &nbsp; <BR>&nbsp; ProcessSocketException(se,nIndex); &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; /// &nbsp; &lt;summary&gt; &nbsp; <BR>&nbsp; /// 
&nbsp; 接受新连接,并保存到连接数组 &nbsp; <BR>&nbsp; /// &nbsp; &lt;/summary&gt; &nbsp; 
<BR>&nbsp; /// &nbsp; &lt;param &nbsp; name="ar"&gt;&lt;/param&gt; &nbsp; 
<BR>&nbsp; private &nbsp; void &nbsp; OnAccept(IAsyncResult &nbsp; ar) &nbsp; 
<BR>&nbsp; { &nbsp; <BR>&nbsp; try &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; Socket 
&nbsp; sWait = &nbsp; (Socket)ar.AsyncState; &nbsp; <BR>&nbsp; //new &nbsp; 
connect &nbsp; socket &nbsp; <BR>&nbsp; Socket &nbsp; sNew = &nbsp; 
sWait.EndAccept(ar); &nbsp; <BR>&nbsp; sWait.BeginAccept(proOnAccept,sWait); 
&nbsp; <BR>&nbsp; Console.Write(sNew.RemoteEndPoint.ToString()); &nbsp; 
<BR>&nbsp; // &nbsp; 超过最大连接数 &nbsp; <BR>&nbsp; if(nSocketNum &nbsp; &gt;= &nbsp; 
MAX_CONNECT) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; sNew.Close(); &nbsp; 
<BR>&nbsp; return &nbsp; ; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; for(int &nbsp; i &nbsp; =0; &nbsp; i&lt; &nbsp; 
MAX_CONNECT &nbsp; ; &nbsp; i++) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; if(aSock[i].thisSocket &nbsp; &nbsp; == &nbsp; null) &nbsp; 
<BR>&nbsp; { &nbsp; <BR>&nbsp; aSock[i].thisSocket &nbsp; = sNew; //insert 
&nbsp; <BR>&nbsp; WaitForData(i); &nbsp; <BR>&nbsp; nSocketNum &nbsp; &nbsp; ++; 
&nbsp; <BR>&nbsp; Console.WriteLine(" &nbsp; insert &nbsp; a &nbsp; Socket 
&nbsp; ,position &nbsp; = &nbsp; {0},count &nbsp; = &nbsp; {1}",i,nSocketNum); 
&nbsp; <BR>&nbsp; break; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
} &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; &nbsp; <BR>&nbsp; 
} &nbsp; <BR>&nbsp; catch(ObjectDisposedException) &nbsp; <BR>&nbsp; { &nbsp; 
<BR>&nbsp; System.Diagnostics.Debugger.Log(0,"1","\n &nbsp; OnClientConnection: 
&nbsp; Socket &nbsp; has &nbsp; been &nbsp; closed\n"); &nbsp; <BR>&nbsp; } 
&nbsp; <BR>&nbsp; catch(SocketException &nbsp; se) &nbsp; <BR>&nbsp; { &nbsp; 
<BR>&nbsp; Console.WriteLine &nbsp; ( &nbsp; se.Message &nbsp; ); &nbsp; 
<BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; // &nbsp; <BR>&nbsp; } &nbsp; 
<BR>&nbsp; &nbsp; <BR>&nbsp; /// &nbsp; &lt;summary&gt; &nbsp; <BR>&nbsp; /// 
&nbsp; 处理连接错误,断开连接,释放资源 &nbsp; <BR>&nbsp; /// &nbsp; &lt;/summary&gt; &nbsp; 
<BR>&nbsp; /// &nbsp; &lt;param &nbsp; name="se"&gt;&lt;/param&gt; &nbsp; 
<BR>&nbsp; /// &nbsp; &lt;param &nbsp; name="nIndex"&gt;&lt;/param&gt; &nbsp; 
<BR>&nbsp; private &nbsp; void &nbsp; ProcessSocketException(SocketException 
&nbsp; se,int &nbsp; nIndex) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; if(se &nbsp; 
!= &nbsp; null) &nbsp; <BR>&nbsp; Console.WriteLine &nbsp; ("Error &nbsp; code 
&nbsp; = &nbsp; {0},message &nbsp; = &nbsp; '{1}'",se.ErrorCode,se.Message 
&nbsp; ); &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; //断开连接 &nbsp; <BR>&nbsp; 
if(aSock[nIndex].thisSocket &nbsp; &nbsp; != &nbsp; null) &nbsp; <BR>&nbsp; { 
&nbsp; <BR>&nbsp; aSock[nIndex].Reset(); &nbsp; <BR>&nbsp; if( &nbsp; nSocketNum 
&nbsp; &gt; &nbsp; 0) &nbsp; <BR>&nbsp; nSocketNum --; &nbsp; <BR>&nbsp; 
Console.WriteLine("remove &nbsp; a &nbsp; Client &nbsp; Socket &nbsp; ,position= 
&nbsp; {0},count &nbsp; = &nbsp; {1}",nIndex,nSocketNum); &nbsp; <BR>&nbsp; } 
&nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; <A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10508028>10 楼</A>gujianxin(木头象)<INPUT class=user5 title="五级用户 该版得分小于等于5000分,大于2000分" type=button></STRONG><SPAN>回复于 
2003-03-28 11:36:22 得分 0 </SPAN></H3>
<P>/////////////// &nbsp; <BR>&nbsp; //好多垃圾 &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
&nbsp; <BR>&nbsp; /// &nbsp; &lt;summary&gt; &nbsp; <BR>&nbsp; /// &nbsp; 活动检测 
&nbsp; <BR>&nbsp; /// &nbsp; &lt;/summary&gt; &nbsp; <BR>&nbsp; private &nbsp; 
void &nbsp; ActiveCheck() &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; for(int &nbsp; i &nbsp; =0, &nbsp; j= &nbsp; 0; &nbsp; (i&lt; &nbsp; 
MAX_CONNECT) &nbsp; &amp;&amp;( &nbsp; j &nbsp; &lt; &nbsp; nSocketNum); &nbsp; 
i++) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; if(aSock[i].thisSocket &nbsp; == 
&nbsp; null) &nbsp; <BR>&nbsp; continue; &nbsp; <BR>&nbsp; try &nbsp; <BR>&nbsp; 
{ &nbsp; <BR>&nbsp; if(aSock[i].thisSocket.Connected &nbsp; ) &nbsp; <BR>&nbsp; 
aSock[i].thisSocket.Send(bCheck); &nbsp; <BR>&nbsp; else &nbsp; <BR>&nbsp; 
ProcessSocketException(null,i); &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; 
catch(Exception &nbsp; ) &nbsp; <BR>&nbsp; { &nbsp; <BR>&nbsp; 
ProcessSocketException(null,i); &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; 
<BR>&nbsp; j ++; &nbsp; <BR>&nbsp; } &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; } 
&nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; } &nbsp; 
<BR>&nbsp; } &nbsp; <BR>&nbsp; <A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10508414>11 楼</A>whxbb(whxbb)<INPUT class=user4 title="四级用户 该版得分小于等于2000分,大于1000分" type=button></STRONG><SPAN>回复于 
2003-03-28 11:44:38 得分 0 </SPAN></H3>
<P>使用 &nbsp; threadpool &nbsp; 管理线程。<A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10520222>12 楼</A>citymeteor(流星)<INPUT class=user5 title="五级用户 该版得分小于等于5000分,大于2000分" type=button></STRONG><SPAN>回复于 
2003-03-28 16:27:12 得分 0 </SPAN></H3>
<P>threadpool &nbsp; 怎么用?<A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10521134>13 楼</A>wolve(祝你生活愉快)<INPUT class=star1 title="一星用户 该版得分小于等于10000分,大于5000分" type=button></STRONG><SPAN>回复于 
2003-03-28 16:47:38 得分 0 </SPAN></H3>
<P>我最近也在写这个东西,我的思路是用同步。 &nbsp; <BR>&nbsp; 
服务开始时启动一个主线程,如果有客户端连接时就产生一个线程处理与客户端的连接。我把线程和客户端封装在类ClientThread中,另处还有一个类Protocol处理数据传输,我是根据java中的思路来做的,不过效率好像很低,有兴趣交流一下<A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10529987>14 楼</A>SaSBYa(人的价值就是为社会创造的价值。)<INPUT class=star1 title="一星用户 该版得分小于等于10000分,大于5000分" type=button></STRONG><SPAN>回复于 
2003-03-28 21:54:02 得分 0 </SPAN></H3>
<P>关注<A href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10534384>15 楼</A>qiuafa()<INPUT class=user2 title="二级用户 该版得分小于等于500分,大于100分" type=button></STRONG><SPAN>回复于 
2003-03-29 09:13:18 得分 0 </SPAN></H3>
<P>接分&amp;捧场<A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10538492>16 楼</A>gweidian(向高手学习)<INPUT class=user3 title="三级用户 该版得分小于等于1000分,大于500分" type=button></STRONG><SPAN>回复于 
2003-03-29 11:59:20 得分 0 </SPAN></H3>
<P>UP<A href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10551849>17 楼</A>Lostinet(每晚 8:00 见)<INPUT class=star2 title="二星用户 该版得分小于等于30000分,大于10000分" type=button></STRONG><SPAN>回复于 
2003-03-29 23:06:20 得分 0 </SPAN></H3>
<P>谁帮 &nbsp; <BR>&nbsp; 
http://expert.csdn.net/Expert/TopicView1.asp?id=1567017<A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10553961>18 楼</A>ji0(际零)<INPUT class=user1 title="一级用户 该版得分小于等于100分" type=button></STRONG><SPAN>回复于 
2003-03-30 07:15:14 得分 0 </SPAN></H3>
<P>up<A href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10563560>19 楼</A>huan_jinwu(金屋藏娇,得抱源码归)<INPUT class=user5 title="五级用户 该版得分小于等于5000分,大于2000分" type=button></STRONG><SPAN>回复于 
2003-03-30 18:25:43 得分 0 </SPAN></H3>
<P>学习ing<A href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10613014>20 楼</A>turui()<INPUT class=user2 title="二级用户 该版得分小于等于500分,大于100分" type=button></STRONG><SPAN>回复于 
2003-04-01 14:08:53 得分 <EM>20</EM></SPAN></H3>
<P>服务程序应该尽量少的开辟线程,通讯用异步来完成。 &nbsp; <BR>&nbsp; 
服务程序应该尽量少的,开辟释放内存,事先开辟好足够的内存自己做内存管理(可以参看unix的内存管理) &nbsp; <BR>&nbsp; 
服务程序尽量少的减少io操作,例如文件的读取,可以采用内存映像文件。 &nbsp; <BR>&nbsp; &nbsp; <BR>&nbsp; 
服务程序与客户端通讯的协议要定义清楚规范,尽量少的减少数据的传递 &nbsp; <BR>&nbsp; 
还有一些常用的方法,例如:解析xml的时候不要用XmlDocument,数据量大的时候非常慢,改用XmlReader,自己控制。<A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10613098>21 楼</A>turui()<INPUT class=user2 title="二级用户 该版得分小于等于500分,大于100分" type=button></STRONG><SPAN>回复于 
2003-04-01 14:10:49 得分 0 </SPAN></H3>
<P>数据查找用:hush &nbsp; table &nbsp; 排序用:快速排序等,常用的方法。 &nbsp; <BR>&nbsp; 
还有一些,像数据缓冲,连接管理,等有功夫自己好好研究。<A 
href="http://topic.csdn.net/t/20030327/22/1586528.html#">Top</A></P>
<H3><STRONG><A class=anchor name=r_10762579>22 楼</A>zkp(zkp)<INPUT class=user1 title="一级用户 该版得分小于等于100分" type=button></STRONG><SPAN>回复于 
2003-04-06 23:06:05 得分 0 </SPAN></H3>
<P>发现问题主要出现在服务端传送大量的数据(数据库结果),导致内存暴涨,超出最大内存,服务down掉。 &nbsp; <BR>&nbsp; 
而客户端主要是因为超时或网络问题出现无法连接的错误。 &nbsp; <BR>&nbsp; 目前解决方案如下: &nbsp; <BR>&nbsp; 
在服务端采用分批传送的方法,能够使服务器内存有所降低,也使客户端响应速度大大加快。 &nbsp; <BR>&nbsp; 
并且使用传输完成标示,如果客户端没有收到完成标示,就一直尝试读取,直到超时。 &nbsp; <BR>&nbsp; 
为了能应付大规模访问,服务端采用Http的请求响应方式,一旦请求完成就自动断开。 &nbsp; <BR>&nbsp; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -