2016-03-04 58 views
0

這是我的代碼。我成功發送數據但沒有收到任何數據。這裏是我的代碼如下。實際上,我通過套接字發送了23個字節,並且它正在執行事件,但沒有收到數據服務器正在發回。我想有持續的雙向定向連接來發送和接收數據異步套接字C#發送數據但未收到

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.Text; 
using System.Collections.Generic; 

// State object for receiving data from remote device. 
public class StateObject 
{ 
    // Client socket. 
    public Socket workSocket = null; 
    // Size of receive buffer. 
    public const int BufferSize = 256; 
    // Receive buffer. 
    public byte[] buffer = new byte[BufferSize]; 
    // Received data string. 
    public StringBuilder sb = new StringBuilder(); 
} 

public class AsynchronousClient 
{ 
    // The port number for the remote device. 
    private const int port = 18001; 

    // ManualResetEvent instances signal completion. 
    private static ManualResetEvent connectDone = 
     new ManualResetEvent(false); 
    private static ManualResetEvent sendDone = 
     new ManualResetEvent(false); 
    private static ManualResetEvent receiveDone = 
     new ManualResetEvent(false); 

    // The response from the remote device. 
    private static String response = String.Empty; 

    private static void StartClient() 
    { 
     // Connect to a remote device. 
     try 
     { 


      IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.1.140"), port); 

      // Create a TCP/IP socket. 
      Socket client = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 
      // Connect to the remote endpoint. 
      client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client); 
      connectDone.WaitOne(); 

      // Send test data to the remote device. 
      Send(client, "This is a test<EOF>"); 
      sendDone.WaitOne(); 

      // Receive the response from the remote device. 
      Receive(client); 
      receiveDone.WaitOne(); 

      // Write the response to the console. 
      Console.WriteLine("Response received : {0}", response); 

      // Release the socket. 
      client.Shutdown(SocketShutdown.Both); 
      client.Close(); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

    private static void ConnectCallback(IAsyncResult ar) 
    { 
     try 
     { 
      // Retrieve the socket from the state object. 
      Socket client = (Socket)ar.AsyncState; 

      // Complete the connection. 
      client.EndConnect(ar); 

      Console.WriteLine("Socket connected to {0}", 
       client.RemoteEndPoint.ToString()); 

      // Signal that the connection has been made. 
      connectDone.Set(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

    private static void Receive(Socket client) 
    { 
     try 
     { 
      // Create the state object. 
      StateObject state = new StateObject(); 
      state.workSocket = client; 

      // Begin receiving the data from the remote device. 
      client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
       new AsyncCallback(ReceiveCallback), state); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

    private static void ReceiveCallback(IAsyncResult ar) 
    { 
     try 
     { 

      StateObject state = (StateObject)ar.AsyncState; 
      Socket client = state.workSocket; 

      // Read data from the remote device. 
      int bytesRead = client.EndReceive(ar); 

      if (bytesRead > 0) 
      { 
       // There might be more data, so store the data received so far. 
       state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 

       // Get the rest of the data. 
       client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
        new AsyncCallback(ReceiveCallback), state); 
      } 
      else 
      { 
       // All the data has arrived; put it in response. 
       if (state.sb.Length > 1) 
       { 
        response = state.sb.ToString(); 
       } 
       // Signal that all bytes have been received. 
       receiveDone.Set(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

    private static void Send(Socket client, String data) 
    { 

     // F2 00 DATA FF 

     List<byte> byteTemp = new List<byte>(); 
     byteTemp.Add(0XF2); 
     byteTemp.Add(0X00); 


     byte[] TcpData = Encoding.ASCII.GetBytes("0040005001100180"); 
     foreach (byte eachdata in TcpData) 
     { 
      byteTemp.Add(eachdata); 
     } 

     byteTemp.Add(0XFF); 

     byte[] byteData = byteTemp.ToArray(); 




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

    private static void SendCallback(IAsyncResult ar) 
    { 
     try 
     { 
      // Retrieve the socket from the state object. 
      Socket client = (Socket)ar.AsyncState; 

      // Complete sending the data to the remote device. 
      int bytesSent = client.EndSend(ar); 
      Console.WriteLine("Sent {0} bytes to server.", bytesSent); 

      // Signal that all bytes have been sent. 
      sendDone.Set(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
    } 

    public static int Main(String[] args) 
    { 
     StartClient(); 
     return 0; 
    } 
} 
+0

你在做什麼?它不是異步的?它是異步強制去同步。你爲什麼不使用'Connect()','Send()'等等?你想解決什麼問題? – jgauffin

+0

只要做一個異步的接收並在你收到一些東西時觸發一個事件。讓所有其他人使用同步方法。 – jgauffin

+0

這是一個微軟asyncrhonous的例子,它是如何來強迫它是同步:) –

回答

2
private static void ReceiveCallback(IAsyncResult ar) 
{  
    try 
    { 
     Console.WriteLine("Receieve Call Back Invoked"); 

     StateObject state = (StateObject)ar.AsyncState; 
     Socket client = state.workSocket; 

     // Read data from the remote device. 
     int bytesRead = client.EndReceive(ar); 
     Console.WriteLine("Receieve End Receieve"); 
     if (bytesRead > 0) 
     { 
      // There might be more data, so store the data received so far. 
      state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 
      Console.WriteLine("Read : " + bytesRead.ToString()); 
      // Get the rest of the data. 
      client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
       new AsyncCallback(ReceiveCallback), state); 
      Console.WriteLine("Begin Receieve completed"); 
     } 
     else 
     { 
      // All the data has arrived; put it in response. 
      if (state.sb.Length > 1) 
      { 
       response = state.sb.ToString(); 
      } 
      Console.WriteLine("Received data from client"); 
      // Signal that all bytes have been received. 
      receiveDone.Set(); 
     } 
     Console.WriteLine("completed receive callback"); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
    } 
} 

數據已收到,但沒有得到執行上述方法不能用來作爲「其他」。

+0

是的,我發現這yesteday這個問題已解決謝謝反正 –