2012-12-20 54 views
0

狀態如何我如果條件異步套接字編程使用。如果在異步Socket編程

例如,如果客戶端發送「你好」,然後服務器響應是「喜」,如果客戶端發送「如何[R U」然後服務器發送「我很好」。 我有這個代碼,我試圖做到這一點,但它不起作用。 請告訴我需要更改我的代碼。 由於提前 這裏是服務器代碼

公共類StateObject { 公共插座workSocket = NULL;

 public const int BufferSize = 1024; 

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

     public StringBuilder sb = new StringBuilder(); 

    } 
    public class AsynchronousSocketListener 
    { 

     public static ManualResetEvent allDone = new ManualResetEvent(false); 

     public AsynchronousSocketListener() 
     { 

     } 

     public static void StartListening() 
     { 
      byte[] bytes = new Byte[1024]; 

      IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 

      IPAddress ipAddress = ipHostInfo.AddressList[0]; 

      IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8888); 

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

      try 
      { 

       listener.Bind(localEndPoint); 

       listener.Listen(100); 

       while (true) 
       { 
        allDone.Reset(); 

        Console.WriteLine("Waiting for a connection..."); 

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

        allDone.WaitOne(); 

       } 



      } 
      catch (Exception e) 
      { 

       Console.WriteLine(e.ToString()); 

      } 



      Console.WriteLine("\nPress ENTER to continue..."); 

      Console.Read(); 

     } 



     public static void AcceptCallback(IAsyncResult ar) 
     { 
      allDone.Set(); 

      Socket listener = (Socket)ar.AsyncState; 

      Socket handler = listener.EndAccept(ar); 

      StateObject state = new StateObject(); 

      state.workSocket = handler; 

      handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state); 

     } 

     public static void ReadCallback(IAsyncResult ar) 
     { 

      String content = String.Empty; 

      StateObject state = (StateObject)ar.AsyncState; 

      Socket handler = state.workSocket; 

      int bytesRead = handler.EndReceive(ar); 

      if (bytesRead > 0) 
      { 
       state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 

       content = state.sb.ToString(); 

       if (content.IndexOf("<EOF>") > -1) 
       { 
        if (content == "hello") 
        { 
         Console.WriteLine(content); 
         Send(handler, content); 
        } 
        else if (content == "How r u") 
        { 
         Console.WriteLine(content); 
         Send2(handler, content); 
        } 
       } 
       else 
       { 

        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state); 

       } 


      } 

     } 

     private static void Send(Socket handler, String data) 
     { 
      data = "Hi"; 

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

      handler.BeginSend(byteData, 0, byteData.Length, 0,new AsyncCallback(SendCallback), handler); 

     } 


     private static void Send2(Socket handler, String data) 
     { 
      data = "fine"; 

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

      handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler); 

     } 

     private static void SendCallback(IAsyncResult ar) 
     { 

      try 
      { 
       Socket handler = (Socket)ar.AsyncState; 

       int bytesSent = handler.EndSend(ar); 

       Console.WriteLine("Sent {0} bytes to client.", bytesSent); 

       handler.Shutdown(SocketShutdown.Both);  

       handler.Close(); 

      } 
      catch (Exception e) 
      { 

       Console.WriteLine(e.ToString()); 

      } 

     } 

     public static int Main(String[] args) 
     { 

      StartListening(); 

      return 0; 

     } 

    } 

回答

0

content == "How r u" and content == "hello"通過比較那裏的參考來檢查對象的相等性。 content和你的const字符串不在同一個內存中(不是相同的對象)。

比較有內容的呼叫content.compareTo("How r u")==0

0

我解決它。我只需要在「hello」的末尾加上<,就像「你好< eof>」一樣,並且與你的相同。現在的工作。