首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

socket开发,多终端,小数据量,应该采用什么方式好些.该怎么解决

2012-01-09 
socket开发,多终端,小数据量,应该采用什么方式好些.privatevoidbutton1_Click(objectsender,System.EventA

socket开发,多终端,小数据量,应该采用什么方式好些.
private   void   button1_Click   (   object   sender   ,   System.EventArgs   e   )  
{  
ListBox1.Items   .Add   (   "服务已经启动! "   )   ;  
_thread1   =   new   Thread   (   new   ThreadStart   (   Listen   )   )   ;  
_thread1.Start   (   )   ;  
}


private   void   Listen   (   )  
{

//创建一个tcpListener对象,此对象主要是对给定端口进行侦听  
tcpListener   =   new   TcpListener(iPort);  
//开始侦听  
tcpListener.Start();  

//返回可以用以处理连接的Socket实例  
socketForClient   =   tcpListener.AcceptSocket   (   )   ;  

//如果返回值是 "true ",则产生的套节字已经接受来自远方的连接请求  
if   (   socketForClient.Connected   )  
{  
ListBox1.Items.Add   (   "已经和客户端成功连接! "   )   ;  

bool   isOKa   =   true;


while   (   true   )  
{

try
{

//创建networkStream对象通过网络套节字来接受和发送数据  
networkStream   =   new   NetworkStream   (   socketForClient   )   ;  
            //从当前数据流中读取一行字符,返回值是字符串  
          streamReader   =   new   StreamReader   (networkStream,Encoding.ASCII)   ;  
          byte[]   byteMessage=new   byte[1024];  
          string   msg   = " ";
          int   bytes;
          bytes   =   socketForClient.Receive(byteMessage,byteMessage.Length,0);
          msg   +=   Encoding.ASCII.GetString(byteMessage,   0,   bytes);

          ListBox1.Items.Add   (   "收到客户端信息: "   +   msg   +   ": ")   ;  
          log( "收到客户端信息: "   +   msg);
          streamWriter   =   new   StreamWriter   (   networkStream,Encoding.ASCII   )   ;  

int   iMsgLen   =   msg.Length;


          SI.SocketInterfaceLogic.General   myG   =   new   SI.SocketInterfaceLogic.General();
string   Cur_time   =   myG.SIdatetime(System.DateTime.Now);
string   strHead   =   msg.Substring(0,10).Trim();
SI.SocketInterfaceLogic.Head   myHead   =   new   SI.SocketInterfaceLogic.Head(strHead);
int   bodyLen   =   myG.SIintToint(myHead.command_length)-10;
string   strBody   =   msg.Substring(10,bodyLen);
switch(myHead.func_no.Trim())
{
//公话认证,下发1  
case   "10 ":

//往当前的数据流中写入一行字符串  
streamWriter.WriteLine( "001110 "+myHead.seq_no+ "1 ",Encoding.ASCII);
this.ListBox1.Items.Add( "001110 "+myHead.seq_no+ "1 ");
//刷新当前数据流中的数据
streamWriter.Flush(   );
break;

//STDT_READ_MSG,学生卡读取留言操作
case   "02 ":

Encoding   e1   =   Encoding.GetEncoding( "GB2312 ");


string   toBeSent1   =   STDT_READ_MSG(strBody,myHead.seq_no);
byte[]   byteToBeSent1   =   e1.GetBytes(toBeSent1);
networkStream.Write(byteToBeSent1,0,byteToBeSent1.Length);
networkStream.Flush();

////往当前的数据流中写入一行字符串  
//streamWriter.WriteLine(STDT_READ_MSG(strBody,myHead.seq_no),Encoding.ASCII);
this.ListBox1.Items.Add(STDT_READ_MSG(strBody,myHead.seq_no));
log( "STDT_READ_MSG,学生卡读取留言操作: "+STDT_READ_MSG(strBody,myHead.seq_no));
////刷新当前数据流中的数据
//streamWriter.Flush(   );
break;

//STDT_CARD_LOGIN,学生卡登录操作
case   "01 ":

....................


终端挺多,数据量小,应该采用什么方式好些.怎样监控一个新的连接呢...
终端与服务器有心跳包,而且要一段时间同步时间...

是用多线程一个终端开一个线程呢,
还是就这样一个线程case完了后关闭

把//创建一个tcpListener对象,此对象主要是对给定端口进行侦听  
tcpListener   =   new   TcpListener(iPort);  
//开始侦听  
tcpListener.Start();  

//返回可以用以处理连接的Socket实例  
socketForClient   =   tcpListener.AcceptSocket   (   )   ;  
放到while里呢?

经验少,请高人指点,谢谢......

[解决办法]
socket高性能的话楼主可以搜下完成端口
[解决办法]
tcpListener最好放在while循環中﹐防止遺漏請求。而且tcpListener每次accept后產生一個獨立的連接﹐不影響繼續偵聽。
[解决办法]
楼主可以看看这个

http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html
[解决办法]
使用IOCP

[解决办法]
异步的Socket api 例如BeginReceive之类,如果是在2000以上的机器上,内部用的就是完成端口的机理。


[解决办法]
使用完成端口
[解决办法]
用异步比较好 我的代码

ManualResetEvent allDone = new ManualResetEvent(false);
while (!shuttingDown)
{
allDone.Reset();
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
allDone.WaitOne();
}
[解决办法]
不知到啊
[解决办法]
http://hi.baidu.com/yuanzb/blog/item/ae81818223f24abe6d81196f.html
使用tcp短连接接受完数据之后,马上断开连接
[解决办法]
Thread thread = new Thread(new ThreadStart(begReceive));

begReceive是什么函数??代码都没有!
[解决办法]
支持一下吧...

看来问题都解决了...

^o^

热点排行