c# - 如何从 .NET Core 中的 Socket 接收数据?

标签 c# sockets tcp .net-core tcpclient

我目前正在将硬件库移植到 .NET Core。通信通过 TCP 进行。我对“Socket.BeginReceive”方法有疑问。 MSDN

.NET Core 中似乎没有等效的方法。如何从 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();
    }
}

最佳答案

我找到了另一种方法。希望这对其他人有帮助。

基本上我刚刚结束使用 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;
}

关于c# - 如何从 .NET Core 中的 Socket 接收数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41247218/

相关文章:

java - 使用OutputStreamWriter写入二进制char数组

Azure WebApp SNAT 耗尽 - 私有(private)终结点能否改进

java - 为什么我的对账单没有发送到客户端?

c# - 检查对象的类型是否来自特定的命名空间

c# - 按列对 ListView 进行排序

c# - 如何阻止对话窗口被隐藏

linux - 从 tcpdump 输出中删除不必要的字符

c# - linQ 到 lambda 的翻译在 linQpad4 中不起作用

c - C 中两个服务器的套接字客户端

java - 如何修复: Anylogic does not connect to Eclipse over Socket