2012-09-10 189 views
0

我試圖開發WP7(客戶端)上基於套接字的應用程序和WPF(服務器),我有問題,我不明白。異步套接字連接丟失

我寫的「服務器」類,這應該處理與客戶和recieving字符串連接。

的問題是,服務器recieving只是第一個字符串由客戶端發送,然後連接被打破,我不得不重置我的客戶端應用程序(僅適用於客戶端)。我假設它是服務器端問題,因爲我正在使用異步調用重寫服務器應用程序。在客戶運作良好之前。我的服務器端代碼:

public class StateObject 
    { 
     public byte[] Buffer { get; set; } 
     public Socket WorkSocket { get; set; } 
    } 

    public class MessageRecievedEventArgs : EventArgs 
    { 
     public string Message { get; set; } 
    } 

    public class Server 
    { 
     ManualResetEvent _done; 
     TcpListener _listener; 

     public event EventHandler<MessageRecievedEventArgs> OnMessageRecieved; 
     public Server() 
     { 
      _done = new ManualResetEvent(false); 
      _listener = new TcpListener(IPAddress.Any, 4124); 
     } 

     public void Start() 
     { 
      Thread th = new Thread(StartListening); 
      th.IsBackground = true; 
      th.Start(); 
     } 

     private void StartListening() 
     { 
      _listener.Start(); 
      while (true) 
      { 
       _done.Reset(); 
       _listener.BeginAcceptTcpClient(new AsyncCallback(OnConnected), _listener); 
       _done.WaitOne(); 
      } 

     } 
     private void OnConnected(IAsyncResult result) 
     { 
      TcpListener listener = result.AsyncState as TcpListener; 
      Socket socket = listener.EndAcceptSocket(result); 
      byte[] buffer = new byte[256]; 
      StateObject state = new StateObject { Buffer = buffer, WorkSocket = socket }; 
      socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(OnRead), state); 
     } 

     private void OnRead(IAsyncResult result) 
     { 
      var state = (StateObject)result.AsyncState; 
      int buffNum = state.WorkSocket.EndReceive(result); 
      string message = Encoding.UTF8.GetString(state.Buffer, 0, buffNum); 
      if (OnMessageRecieved != null) 
      { 
       MessageRecievedEventArgs args = new MessageRecievedEventArgs(); 
       args.Message = message; 
       OnMessageRecieved(this, args); 
      } 
      _done.Set(); 
     } 
    } 

客戶:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
     { 
      try 
      { 
       base.OnNavigatedTo(e); 
       _socketEventArgs = new SocketAsyncEventArgs() { RemoteEndPoint = App.Connection.RemoteEndPoint }; 
       Send("{ECHO}"); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

     } 
     private void Send(string key) 
     { 
      var bytes = Encoding.UTF8.GetBytes(key + "$"); 
      _socketEventArgs.SetBuffer(bytes, 0, bytes.Count()); 
      if (Socket.Connected) 
       Socket.SendAsync(_socketEventArgs); 
      else 
       MessageBox.Show("Application is not connected. Please reset connection (press 'back' key and 'connect' button). It may be needed to restart server application"); 
     } 

的「{} ECHO」消息由客戶端發送和收到的服務器 - 每個下被髮送,但沒有收到。我假設我不明白插座異步調用機制......有人可以告訴我嗎? :)

+0

什麼錯誤你得到? – nucleons

+0

我沒有收到錯誤。 @usr是對的。正如我所想,我不明白這一點。現在,當我不止一次地稱它爲「BeginRecieve」時,它就像我想要的那樣工作。 usr如果你把它作爲answear,而不是作爲評論,我會標記它。謝謝 – TrN

回答

0

好像你只是讀取一次。可能你想反覆讀取讀取消耗整個流。