如何读取套接字流直到换行符?

时间:2018-11-05 11:20:40

标签: c# .net sockets

我有一个Node.js服务器+ Unity(.NET 3.5)应用程序,可以确保通过套接字之间进行通信。从Node.js服务器到C#套接字客户端接收数据时遇到问题。

我希望C#客户端读取套接字流,直到找到换行符(/n)。这是我确保数据从C#流向Node.js服务器的方式,因为有一个名为 split 的NPM模块,可以确保逐行读取缓冲区。

以下是我的代码,如果您能向我建议实现上述接收数据方式的解决方案,我将不胜感激:

在这里,我没有问题地连接到Node.js服务器:

private Socket ClientSocket;
private byte[] _receiveBuffer = new byte[8142];

public string hostname;
public int port;

public void onnectClient()
{
    ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    ClientSocket.Connect(hostname, port);
    ClientSocket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}

以下是当前的ReceiveCallback

private void ReceiveCallback(IAsyncResult AR)
{
    int received = ClientSocket.EndReceive(AR);
    byte[] recData = new byte[received];
    Buffer.BlockCopy(_receiveBuffer, 0, recData, 0, received);

    string resultString = System.Text.Encoding.UTF8.GetString(recData);

    currentlyReceivedData = JsonUtility.FromJson<ReceivedData>(resultString);

    ClientSocket.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}

更新1:

现在,我使用TcpClient和StreamReader代替上面的代码,但是由于某些原因,while循环不会继续:

    private void ListenForData()
{
    try
    {
        socketConnection = new TcpClient("localhost", 6670);
        Byte[] bytes = new Byte[1024];
        while (true)
        {

            using (StreamReader sr = new StreamReader(socketConnection.GetStream()))
            {
                string line;
                // Read and display lines from the file until the end of 
                // the file is reached.
                while ((line = sr.ReadLine()) != null)
                {
                    Debug.Log("line");
                }
            }
        }
    }
    catch (SocketException socketException)
    {
        Debug.Log("Socket exception: " + socketException);
    }
}

2 个答案:

答案 0 :(得分:2)

如果不需要使用Socket的所有可用选项,我建议您使用TcpClient类。建立连接后,您可以呼叫GetStream()来接收NetworkStream 1 ,您可以将其传递给StreamReader

您一旦到达那里,就可以致电ReadLine()(或道德上等价的人)来检索每行。这使您可以忽略使用“原始” TCP的许多现实情况,例如必须重建/保存缓冲区以反映它不是消息传递而是字节流的事实。

ReadLine可以应付任何普通形式的行尾,包括\n\r\r\n


1 请注意,您可以从现有的Socket中构造一个。但是我会尝试使用更简单的选项,除非我需要更复杂的选项。

答案 1 :(得分:0)

我建议您查看以下内容:https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/

那可以为您省去很多麻烦!

如果您不能使用System.IO.Pipelines,您仍然可以研究该示例如何从套接字读取直到到达新行!