2016-12-20 25 views
1

現在、ハードウェアライブラリを.NETコアに移植しています。通信はTCPを介して動作します。私は 'Socket.BeginReceive'メソッドに問題があります。 MSDN.NETコアのソケットからデータを受け取る方法は?

.NETコアには同等の方法はないようです。 TCPソケットからデータを受信するにはどうすればよいですか?

private void InternalDataReceived(IAsyncResult ar) 

{ 
    int dataCount = 0; 
    byte[] buffer; 

    try 
    { 
     if (_client != null && _client.Client != null) 
     { 
      dataCount = _client.Client.EndReceive(ar); 
     } 

     if (dataCount > 0) 
     { 
      try 
      { 
       buffer = new byte[dataCount]; 
       Array.Copy(_inBuffer, buffer, dataCount); 

       if (DataReceived != null) 
       { 
        DataReceived(buffer); 
       } 
      } 
      catch (Exception exc) 
      { 
       if (exc is System.Net.Sockets.SocketException) 
       { 
        Disconnect(); 
        return; 
       } 
      } 
      _client.Client.BeginReceive(_inBuffer, 0, _inBuffer.Length, SocketFlags.None, InternalDataReceived, null); 
     } 
    } 
    catch 
    { 
     Disconnect(); 
    } 
} 
+0

[同期](https://docs.microsoft.com/en-us/dotnet/core/api/system.net.socketsがあります。ソケット#System_Net_Sockets_Socket_Receive_System_Byte ___)と[非同期](https://docs.microsoft.com/en-us/dotnet/core/api/system.net.sockets.socket#System_Net_Sockets_Socket_ReceiveAsync_System_Net_Sockets_SocketAsyncEventArgs_).NET Coreの受信バージョン。 –

答えて

1

私はそれを行う別の方法を見つけました。これが他の人に役立つことを願っています

基本的には、私はちょうどNetworkStreamクラスを使用して終了しました。インスタンスを取得するには、TcpClient.GetStream()を呼び出します。ブロックGetStreamを使用してusingブロックを使用すると、接続はusingの後で終了します。これは私が生き続けるために接続が必要なので、私が私の例でそれを使用していない理由です。

MSDN NetworkStream.Read

私のコード例:

static void Main(string[] args) 
{ 
    TcpClient client = new TcpClient(); 

    client.Client.Connect(IPAddress.Parse("192.168.100.5"), 8000); 

    //Task.Run(() => ReadData(client)); 

    Task.Run(() => ReadDataLoop(client)); 

    client.Client.Send(Encoding.ASCII.GetBytes("{\"TID\":1111,\"blabla\":{}}")); 


    while (true) 
    { 

    } 
} 

private static void ReadDataLoop(TcpClient client) 
{ 
    while (true) 
    { 
     if (!client.Connected) 
      break; 

     string xxx = ""; 
     xxx = ReadData(client); 
     Console.WriteLine(xxx); 
    } 
} 

private static string ReadData(TcpClient client) 
{ 
    string retVal; 
    byte[] data = new byte[1024]; 

    NetworkStream stream = client.GetStream(); 


    byte[] myReadBuffer = new byte[1024]; 
    StringBuilder myCompleteMessage = new StringBuilder(); 
    int numberOfBytesRead = 0; 


    do 
    { 
     numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length); 

     myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); 

    } 
    while (stream.DataAvailable); 



    retVal = myCompleteMessage.ToString(); 


    return retVal; 
} 
関連する問題