客户端与服务器通信

mac2022-06-30  26

       最近准备做一个考试系统,所以学习了一下C/S的通信,就现在所知的来说,一般用的通信方式有Web Service、Remoting,还有一种较新的技术WCF,

但我还没学习到,所以暂不涉及。

       开篇即将记录的是最基本的Socket,在.Net中,微软将Socket进行了很好的封装,在基本的通信中,需要在客户端和服务器端各有一个Socket,使使用者不

用了解底层的如TCP、Http或Udp协议就可以很轻松的使用。

       下面是一个简单的TcpClient和TcpListener的应用。

       服务器端通过异步的操作在后台监听所有对5200端口的访问,并获取IP和访问的信息。因为从TcpClient获得的数据流是NetWorkStream,所以我们需要相

应的流对象来对其进行解析并转换为String,但由于在先前设置的缓存大小为256字节,所以当我们获得的数据小于256时,后面将会是自动填充的一连串"/0",所以在

获取数据后还应该将后面的"/0"替换掉,或是根据NetWorkStream的Read方法返回的长度,只截取我们需要的字节数,

       可能有人会问,当传输的数据大于256时呢? 这时我们需要的是分步来读取,每次读取我们能缓存的大小,并写到另外的流中保存,直到NetWorkStream的

Read方法返回的值等于0。

      

       好了,本篇暂时到这里为止。

下面是服务器端的代码:

 

 

using  System; using  System.Collections.Generic; using  System.Text; using  System.Threading; using  System.Net.Sockets; namespace  AsyncWaitingConnect{     delegate   void  asycnDelegate();         class  Program    {         // 声明委托          static  asycnDelegate del;         static  TcpListener listener;         static   byte [] infoBytes  =   new   byte [ 256 ];    //设定缓存为256         static   void  Main( string [] args)        {             // 完成时的回调委托,并绑定StopListen方法             AsyncCallback callBack  =   new  AsyncCallback(StopListen);            listener  =   new  TcpListener( 5200 );            listener.Start();             // 实例化委托             del  =   new  asycnDelegate(beginWait);             // 异步开始监听连接到本机的Client             del.BeginInvoke(callBack,  0 );             // 任意输入停止监听             Console.WriteLine( " Wait for Client./nEnter to Stop waiting " );            Console.ReadLine();            listener.Stop();            Console.ReadLine();        }         static   void   beginWait()        {            TcpClient client;             string  clientIP, clientInfo;             // 开始监听              while  ( true )            {                 try                 {                     // 截断方法,用以等待客户端连接                     client  =  listener.AcceptTcpClient();                                         // 获取客户端的IP                     clientIP  =  client.Client.RemoteEndPoint.ToString();                     // 获取来自客户端信息的字节流                     NetworkStream ns  =  client.GetStream();                     // 转换并输出客户信息                      int  no = ns.Read(infoBytes, 0 , 256 );                     clientInfo  =  UnicodeEncoding.Unicode.GetString(infoBytes,0,no);                     // 输出已连接客户的信息                     Console.WriteLine( " Connected IP is {0}, name is{1} " ,                                       clientIP,clientInfo );                }                 catch  (Exception e)                {                    Console.WriteLine( " 连接停止! " );                     return ;                }            }        }         // 回调的方法          static   void  StopListen(IAsyncResult ar)        {            del.EndInvoke(ar);        }    }

}

 

 

    在客户端中,连接至服务器端,同时发送客户端信息。

 

using  System; using  System.Collections.Generic; using  System.Text; using  System.Net.Sockets; namespace  AsycnWaitingConnectsClient{     class  Program    {         static   void  Main( string [] args)        {            TcpClient client;            System.Net.IPAddress ip  =  System.Net.IPAddress.Parse( " 127.0.0.1 " );             for  ( int  i  =   0 ; i  <   5 ; i ++ )            {                client  =   new  TcpClient();                 try                 {                    client.Connect(ip,  5200 );                }                 catch  (Exception e)                 {                    Console.WriteLine(e.Message);                }                 byte [] Info  =  UnicodeEncoding.Unicode.GetBytes( " MyName is  "   +  i.ToString());                client.Client.Send(Info);            }            Console.ReadLine();        }    }}

 

                                                                                             PS:在这里使用异步操作的原因是考虑到之后将                                                                                                  实现的WinForm的监听,如果使用同步监                                                                                                  听,那在监听的同时将会使整个窗体失去响                                                                                                  应...这是后面将会谈到的,这里略过。

转载于:https://www.cnblogs.com/deepwishly/archive/2010/05/09/2551239.html

最新回复(0)