2012-06-05 44 views
0

我目前tyring創建實現了TCPL監聽多線程和異步TCP服務器異步TCP服務器無法接收數據

當前服務器如預期運行,因爲我能夠將數據發送到服務器的傳輸數據到客戶端沒有任何問題

然而,在我已經發送數據到服務器,然後發送數據回到客戶端,當客戶端再次發送數據回到服務器時,服務器不能接收數據

我已經嘗試了幾天來找到這個問題的答案,但沒有運氣

這裏是我目前正在使用的服務器代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.Windows.Forms; 
using System.IO; 

namespace MyTcpAsyncClass 
{ 
    public class StateObject 
    { 
     public TcpClient MyTcpClient = null; 
     public NetworkStream MyNetworkStream = null; 
     public const int MyBufferSize = 1024; 
     public byte[] MyBuffer = new byte[MyBufferSize]; 
     public string RequestString = ""; 
     public StringBuilder MyStringBuilder = new StringBuilder(); 
     char[] RequestChars; // Char array of Request 
     const char STX = (char)0x02; // Start Character 
     const char FTX = (char)0x03; // Finish Character 

     public void Dispose() 
     { 
      try 
      { 
       MyTcpClient.Close(); 
       MyNetworkStream.Close(); 
       MyNetworkStream.Dispose(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Message:\n" + ex.Message + "\n\nStacktrace:\n" + ex.StackTrace); 
      } 
     } 
    } 

    public static class AsyncServerFunctions 
    { 
     private static int mPort = 0; 

     private static ManualResetEvent MyManualResetEvent = new ManualResetEvent(false); 

     public static void StartListening() 
     { 


      //Catch to Tcp Client Connection 
      try 
      { 
       //Get the database connection 
       //MyReaderWriterLockSlim.EnterReadLock(); 
       LoadSettings(); 
       //MyReaderWriterLockSlim.ExitReadLock(); 

       TcpListener MyTcpListener = new TcpListener(IPAddress.Any, mPort); 
       MyTcpListener.Start(); 

       while (true) 
       { 
        //Set the event to nonsignaled state 
        MyManualResetEvent.Reset(); 

        //Start an asynchronous TcpListener to listen for a connection 
        MyTcpListener.BeginAcceptTcpClient(AcceptTcpClientCallback, MyTcpListener); 

        //Wait until a connection is made before continuing 
        MyManualResetEvent.WaitOne(); 
       } 

       MyTcpListener.Stop(); 
      } 
      catch (Exception ex) 
      { 
       AddErrorLog(ex.Message, ex.StackTrace); 
      } 
     } 

     private static void AcceptTcpClientCallback(IAsyncResult result) 
     { 
      try 
      { 
       //BeginAcceptTcpClientCallback 
       //Signal the main thread to continue 
       MyManualResetEvent.Set(); 
       //Get the TcpClientNetworkStream: 
       TcpListener MyTcpListener = (TcpListener)result.AsyncState; 

       //Finish Async Get Client Process 
       TcpClient MyTcpClient = MyTcpListener.EndAcceptTcpClient(result); 
       StateObject MyStateObject = new StateObject(); 
       MyStateObject.MyTcpClient = MyTcpClient; 
       MyStateObject.MyNetworkStream = MyTcpClient.GetStream(); 

       //Begin Async read from the NetworkStream 
       MyStateObject.MyNetworkStream.BeginRead(MyStateObject.MyBuffer, 0, StateObject.MyBufferSize, new AsyncCallback(BeginReadCallback), MyStateObject); 
      } 
      catch (Exception ex) 
      { 
       AddErrorLog(ex.Message, ex.StackTrace); 
      } 
     } 

     private static void BeginReadCallback(IAsyncResult result) 
     { 
      StateObject MyStateObject = (StateObject)result.AsyncState; 
      NetworkStream MyNetworkStream = MyStateObject.MyNetworkStream; 
      string MyRequestString = ""; 


      try 
      { 
       //Get Request Data here 

       if (MyStateObject.MyBuffer.Length > 0) 
       { 
        //Store the data recived 
        MyStateObject.MyStringBuilder.Clear(); 
        MyStateObject.MyStringBuilder.Append(Encoding.ASCII.GetString(MyStateObject.MyBuffer)); 

        //Get the stored Request string 
        MyRequestString = MyStateObject.MyStringBuilder.ToString(); 

        //Record the string recived 
        DatabaseFunctions.AddMessageLog("String Recived (BeginReadCallback): " + MyRequestString); 

        //Remove the first and last character 
        MyRequestString = CleanString(MyRequestString); 

        //Record the Request String 
        DatabaseFunctions.AddMessageLog("Request String Recived:" + MyRequestString); 

        //Get the Message Identifier 
        string MessageIdentifier = ""; 
        MessageIdentifier = MyRequestString.Substring(0, 2); 

        switch (MessageIdentifier) 
        { 
         case "value": 
          SendResponse(MyStateObject, StartUp(MessageIdentifier, MyRequestString)); 
          SendResponse(MyStateObject, SendTransactionStart(MessageIdentifier, MyAmount)); 
          GetResponse(MyStateObject); 
          break; 
         default: 
          //***Default Case*** 
          SendResponse(MyStateObject, DefaultCase(MyRequestString)); 
          break; 
        } 

        //Dispose of the connection 
        MyStateObject.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       AddErrorLog(ex.Message, ex.StackTrace); 
       try 
       { 
        MyStateObject.Dispose(); 
       } 
       catch 
       { 
        AddErrorLog(ex.Message, ex.StackTrace); 
       } 
      } 
     } 

     private static void SendResponse(StateObject pMyStateObject, string pResponseString) 
     { 
      try 
      { 
       //Send a response to the client 
       //Get bytes from string sent 
       byte[] MyResponseBytes = Encoding.ASCII.GetBytes(pResponseString); 
       //Get the network stream 
       NetworkStream MyNetworkStream = pMyStateObject.MyNetworkStream; 
       //Call SendResponseCallback 
       MyNetworkStream.BeginWrite(MyResponseBytes, 0, MyResponseBytes.Length, new AsyncCallback(SendResponseCallback), pMyStateObject); 
      } 
      catch (Exception ex) 
      { 
       AddErrorLog(ex.Message, ex.StackTrace); 
      } 
     } 

     private static void GetResponse(StateObject pStateObject) 
     { 
      //This will run a new AsyncCallback To get the response from the client 
      NetworkStream MyNetworkStream = pStateObject.MyNetworkStream; 
      pStateObject.MyBuffer = new byte[1024]; 
      MyNetworkStream.BeginRead(pStateObject.MyBuffer, 0, pStateObject.MyBuffer.Length, new AsyncCallback(BeginReadCallback), pStateObject); 
     } 

     private static void SendResponseCallback(IAsyncResult result) 
     { 
      try 
      { 
       //End the send procedure 
       StateObject MyStateObject = (StateObject)result.AsyncState; 
       NetworkStream MyNetworkStream = MyStateObject.MyNetworkStream; 
       MyNetworkStream.Flush(); 
      } 
      catch (Exception ex) 
      { 
       AddErrorLog(ex.Message, ex.StackTrace) 
      } 
     } 

     private static void ShowExceptionMessage(string pMessage, string pStacktrace) 
     { 
      MessageBox.Show("Message:\n" + pMessage + "\n\nStacktrace:\n" + pStacktrace); 
     } 

     private static void AddErrorLog(string pMessage, string pStackTrace) 
     { 
      DatabaseFunctions.AddMessageLog("Message:" + pMessage + "; Stacktrace:" + pStackTrace); 
     } 
    } 
} 

感謝所有

回答

1

你應該叫在AcceptTcpClientCallbackBeginAcceptTcpClient。您不接受第一個連接後的任何新連接。

0

在你BeginReadCallback功能你處理掉你已經用於調用BeginRead嘗試運行沒有處置功能的代碼,你只調用開關狀態的GetRespone函數的對象,嘗試在BeginReadCallback函數調用BeginRead