• 异步Socket通信总结[转]


    服务端(异步)

    using System.Net ;

    using System.Net.Sockets ;

    using System.IO ;

    using System.Text ;

    using System.Threading ;

             public static ManualResetEvent allDone = new ManualResetEvent(false);     

             private Thread th;

             private bool listenerRun = true ;

             Socket listener;

             private const int MAX_SOCKET=10;

             protected override void Dispose( bool disposing )

             {

                  try

                  {

                       listenerRun = false ;

                       th.Abort ( ) ;

                       th = null ;

                       listener.Close();

                  }

                  catch { }               

             }

    //得到本机IP地址

    //得到本机IP地址

             public static IPAddress GetServerIP()

             {

                  IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());

                  return ieh.AddressList[0];

             }

             //侦听方法

             private void Listen()

             {

                  try

                  {

                       int nPort=int.Parse(this.txtLocalPort.Text);

                       IPAddress ServerIp=GetServerIP();

                       IPEndPoint iep=new IPEndPoint(ServerIp,nPort);

                       listener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

                   

                       listener.Bind(iep);

                       listener.Listen(10);

                       statusBar1.Panels[0].Text ="端口:"+this.txtLocalPort.Text+"正在监听......";

                       while(listenerRun)

                       {                          

                           allDone.Reset();

                           listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);

                           allDone.WaitOne();                  

                       }

                  }

                  catch (System.Security.SecurityException )

                  {

                       MessageBox.Show ("防火墙安全错误!","错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);

                  }

             }

             //异步回调函数

             public void AcceptCallback(IAsyncResult ar)

             {            

                  Socket listener = (Socket)ar.AsyncState;

                  Socket client=listener.EndAccept(ar) ;

                  allDone.Set();

                  StateObject state = new StateObject();

                  state.workSocket = client;

                  //远端信息

                  EndPoint tempRemoteEP = client.RemoteEndPoint;

                  IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;

                  string rempip=tempRemoteIP.Address.ToString();

                  string remoport=tempRemoteIP.Port.ToString();

                  IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;

                  string HostName = host.HostName;

                  statusBar1.Panels[1].Text ="接受["+HostName+"] "+rempip+":"+remoport+"远程计算机正确连接!" ;

                  this.listboxRemohost.Items.Add("["+HostName+"] "+rempip+":"+remoport);

                  client.BeginReceive( state.buffer,0, StateObject.BufferSize, 0,

                       new AsyncCallback(readCallback), state); 

                            

             }

    //异步接收回调函数

             public void readCallback(IAsyncResult ar)

             {

                  StateObject state = (StateObject) ar.AsyncState;

                  Socket handler = state.workSocket;            

                  int bytesRead = handler.EndReceive(ar);           

                  if (bytesRead > 0)

                  {

                       string strmsg=Encoding.ASCII.GetString(state.buffer,0,bytesRead);

                       state.sb.Append(strmsg);

                       string content = state.sb.ToString();

                        

                       //远端信息

                       EndPoint tempRemoteEP = handler.RemoteEndPoint;

                       IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;

                       string rempip=tempRemoteIP.Address.ToString();

                       string remoport=tempRemoteIP.Port.ToString();

                       IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;

                       string HostName = host.HostName;

                       statusBar1.Panels[1].Text ="正在接收["+HostName+"] "+rempip+":"+remoport+"的信息..." ;

                       string time = DateTime.Now.ToString ();

                       listboxRecv.Items.Add("("+time+") "+HostName+":");

                       listboxRecv.Items.Add(strmsg) ;

                            

                       if(content.IndexOf("\x99\x99")> -1)

                       {

                           statusBar1.Panels[1].Text ="信息接收完毕!" ;

                           //////////////////////////////////////////////////

                           //接收到完整的信息

    //                     MessageBox.Show("接收到:"+content);

                           string msg=poweryd.CodeParse(content);

                           Send(handler,msg);//异步发送

    //                     Send(content);//用单独的socket发送

                       }

                       else

                       {

                           handler.BeginReceive(state.buffer,0,StateObject.BufferSize, 0,

                                new AsyncCallback(readCallback), state);

                       }

                  }

             }

             //异步发送

             private void Send(Socket handler, String data)

             {            

                  byte[] byteData = Encoding.ASCII.GetBytes(data);            

                  handler.BeginSend(byteData, 0, byteData.Length, 0,

                       new AsyncCallback(SendCallback), handler);

    //            handler.Send(byteData);

             }

             #region  //用单独的socket发送

             private void Send(string data)

             {            

    //            string ip=this.txtRemoIP.Text;

    //            string port=this.txtRemoport.Text;

    //            IPAddress serverIp=IPAddress.Parse(ip);           

    //            int serverPort=Convert.ToInt32(port);

    //            IPEndPoint iep=new IPEndPoint(serverIp,serverPort);               

    //            Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

    //            socket.Connect(iep);            

    //            byte[] byteMessage=Encoding.ASCII.GetBytes(data);

    //            socket.Send(byteMessage);

    //            socket.Shutdown(SocketShutdown.Both);

    //            socket.Close();            

             }

             #endregion

    //异步发送回调函数

    //异步发送回调函数

             private static void SendCallback(IAsyncResult ar)

             {

                  try

                  {                 

                       Socket handler = (Socket) ar.AsyncState;               

                       int bytesSent = handler.EndSend(ar);

                       MessageBox.Show("发送成功!");

                       handler.Shutdown(SocketShutdown.Both);

                       handler.Close();

                  }

                  catch (Exception ex)

                  {

                       MessageBox.Show(ex.ToString());

                  }

             }

             private void btnListen_Click(object sender, System.EventArgs e)

             {

                  th = new Thread (new ThreadStart(Listen));//以Listen过程来初始化线程实例       

                  th.Start();//启动此线程

                  this.btnListen.Enabled=false;            

             }

             private void btnClosenet_Click(object sender, System.EventArgs e)

             {

                  try

                  {

                       listenerRun = false ;

                       th.Abort ( ) ;

                       th = null ;                  

                       listener.Close();

                       statusBar1.Panels[0].Text= "与客户端断开连接!";

                       statusBar1.Panels[1].Text= "";

                  }

                  catch

                  {

                       MessageBox.Show("连接尚未建立,断开无效!","警告");

                  }         

             }

             private void btnExit_Click(object sender, System.EventArgs e)

             {

                  try

                  {

                       listenerRun = false ;

                       th.Abort ( ) ;

                       th = null ;                  

                       listener.Close();

                       statusBar1.Panels[0].Text= "与客户端断开连接!";

                       statusBar1.Panels[1].Text= "";

                  }

                  catch(Exception ex)

                  {

                       MessageBox.Show(ex.Message);

                  }

                  finally

                  {

                       Application.Exit();

                  }

             }

         //异步传递的状态对象

         public class StateObject

         {

             public Socket workSocket = null;

             public const int BufferSize = 1024;

             public byte[] buffer = new byte[BufferSize];

             public StringBuilder sb = new StringBuilder();

         }

    客户端(同步发送并接收):

    using System.Net ;

    using System.Net.Sockets ;

    using System.IO ;

    using System.Text ;

    using System.Threading ;

             Socket socket;

             int numbyte=1024;//一次接收到的字节数

             private void btnConnect_Click(object sender, System.EventArgs e)

             {

                  try

                  {

                       string ip=this.txtRemoIP.Text;

                       string port=this.txtRemoport.Text;

                      IPAddress serverIp=IPAddress.Parse(ip);           

                       int serverPort=Convert.ToInt32(port);

                       IPEndPoint iep=new IPEndPoint(serverIp,serverPort);

                       IPHostEntry host = Dns.GetHostByAddress(iep.Address ) ;

                       string HostName = host.HostName;

                   

                       socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

                       socket.Connect(iep);

                       IPEndPoint tempRemoteIP=( IPEndPoint )socket.LocalEndPoint;

                       statusBar1.Panels[0].Text ="端口:"+tempRemoteIP.Port.ToString()+"正在监听......";             

                       statusBar1.Panels[1].Text ="与远程计算机["+HostName+"] "+ip+":"+port+"建立连接!" ;

                  }

                  catch

                  {

                       statusBar1.Panels[0].Text = "无法连接到目标计算机!";

                  }

                  #region

    //            byteMessage=Encoding.ASCII.GetBytes(textBox1.Text+"99");

    //            socket.Send(byteMessage);

    //            byte[] bytes = new byte[1024];

    //            socket.Receive(bytes);

    //            string str=Encoding.Default.GetString(bytes);

    //            MessageBox.Show("接收到:"+str);

    //            socket.Shutdown(SocketShutdown.Both);

    //            socket.Close();

                  #endregion

              

             }

             private void btnSend_Click(object sender, System.EventArgs e)

             {

                  try

                  {

                       statusBar1.Panels[1].Text ="正在发送信息!" ;

                       string message=this.txtsend.Text;

                       SendInfo(message);                       

                  }                 

                  catch //异常处理

                  {

                       statusBar1.Panels[0].Text = "无法发送信息到目标计算机!";

                  }

             }

             private void SendInfo(string message)

             {

                  #region

    //            string ip=this.txtip.Text;

    //            string port=this.txtport.Text;

    //

    //            IPAddress serverIp=IPAddress.Parse(ip);           

    //            int serverPort=Convert.ToInt32(port);

    //            IPEndPoint iep=new IPEndPoint(serverIp,serverPort);

    //            byte[] byteMessage;

    //

    //            socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

    //            socket.Connect(iep);

                  #endregion

                  byte[] byteMessage=Encoding.ASCII.GetBytes(message+"\x99\x99");

                  socket.Send(byteMessage);

                  //远端信息

                  EndPoint tempRemoteEP = socket.RemoteEndPoint;

                  IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;

                  string rempip=tempRemoteIP.Address.ToString();

                  string remoport=tempRemoteIP.Port.ToString();

                  IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;

                  string HostName = host.HostName;

                  //发送信息

                  string time1 = DateTime.Now.ToString();

                  listboxsend.Items.Add ("("+ time1 +") "+ HostName +":");

                  listboxsend.Items.Add (message ) ;  

                  //发送完了,直接接收

                  StringBuilder sb = new StringBuilder();

                  while(true)

                  {

                       statusBar1.Panels[1].Text ="正在等待接收信息..." ;

                       byte[] bytes = new byte[numbyte];

                       int recvbytes=socket.Receive(bytes);

                       string strmsg=Encoding.Default.GetString(bytes);

                        

                       string time2 = DateTime.Now.ToString();

                       listboxRecv.Items.Add("("+time2+") "+HostName+":");

                       listboxRecv.Items.Add (strmsg) ;

                        

                       sb.Append(strmsg);

                       if(sb.ToString().IndexOf("\x99\x99")>-1)

                       {

                           break;

                       }

                  }

                  statusBar1.Panels[1].Text ="接收信息完毕!" ;

                  //////////////////////////////////////

                  //代码解码

                  CodeParse(sb.ToString());

                  //////////////////////////////////////

                  socket.Shutdown(SocketShutdown.Both);

                  socket.Close();

             }

             http://www.cnblogs.com/saptechnique/archive/2011/12/21/2295862.html

     

  • 相关阅读:
    MSSQL中join的用法詳解
    程序员的十层楼
    【搜集】错误为: [Microsoft][SQL Native Client]客户端不支持加密
    關於 ASP.NET 中System.OutOfMemoryException 的問題與解決方法
    CSS:快速提升设计可读性和维护性
    【调查 】DBA的压力究竟有多大?
    从沙子到芯片:且看处理器是怎样炼成的
    與伺服器的連接已成功建立 但在登入程序時發生錯誤。 provider 共用記憶提供者 error 0 管道的另一端上無任何處理程序。
    【ZT】Visual Studio Team System縱覽
    Win32.Induc.A的清理方法
  • 原文地址:https://www.cnblogs.com/saptechnique/p/2295862.html
Copyright © 2020-2023  润新知