2016-12-20 3 views
1

В настоящее время я переношу библиотеку оборудования в .NET Core. Связь работает через TCP. У меня проблемы с методом «Socket.BeginReceive». MSDNкак получить данные из Socket в .NET Core?

Похоже, в .NET Core нет эквивалентного метода. Как я могу получить данные из TCP Socket?

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. socket # 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_SocketAyncEventArgs_) версии Receive в .NET Core. –

ответ

1

Я нашел другой способ сделать это. Надеюсь, это помогает кому-то другому.

В основном я только что закончил использование класса NetworkStream. Вы можете получить экземпляр, вызвав TcpClient.GetStream(). Если вы используете using block с GetStream, ваше соединение будет закрыто после 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; 
}