C# 创建一个";“听众”;对于将包含字节[]数组的传入套接字流

C# 创建一个";“听众”;对于将包含字节[]数组的传入套接字流,c#,sockets,stream,memorystream,C#,Sockets,Stream,Memorystream,我正在创建一个套接字服务器,它需要不断地侦听来自连接的客户端的传入消息。这些消息将以字节[]数组发送。我让服务器与StreamReader配合使用,但StreamReader只与发送数据的文本表示配合使用…而不是字节[]数组 以下是我所拥有的: StreamReader reader = new StreamReader(Client.GetStream()); string line = ""; while (true) {

我正在创建一个套接字服务器,它需要不断地侦听来自连接的客户端的传入消息。这些消息将以字节[]数组发送。我让服务器与StreamReader配合使用,但StreamReader只与发送数据的文本表示配合使用…而不是字节[]数组

以下是我所拥有的:

        StreamReader reader = new StreamReader(Client.GetStream());
        string line = "";
        while (true)
        {
            line = reader.ReadLine();
            if (!string.IsNullOrEmpty(line))
            {
                parentForm.ApplyText(line + "\r\n");
                SocketServer.SendBroadcast(line);
            }
        }
我现在需要将其转换为原始流,以某种方式将流内容转换为byte[]数组,但我似乎无法获得它的句柄

我试过这个:

        while (true)
        {
            var bytes = default(byte[]);
            using (var memstream = new MemoryStream())
            {
                var buffer = new byte[512];
                var bytesRead = default(int);
                while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
                    memstream.Write(buffer, 0, bytesRead);
                bytes = memstream.ToArray();
            }
            //parentForm.ApplyText(bytes.Length + "\r\n");
        }
但正如您可能猜到的,while(true)循环并没有按照我所需要的方式工作。谁能帮我做一些代码调整,使这项工作,因为我需要它。它需要持续侦听传入消息,然后在收到消息时,需要对该消息(字节[]数组)执行某些操作,然后再次返回侦听

TIA

我想“持续倾听”不是读者的任务,而是听者的任务。我在使用TcpListener编写服务器时遇到了同样的问题。我不知道你们想做什么,但我正在发布你们“持续倾听”的解决方案,并阅读byte[]问题。我想这段代码可能会帮助您:

TcpListener t = new TcpListener(IPAddress.Loopback, _port);
        t.Start();

        Console.WriteLine("Server is started and waiting for client\n\n");

        byte[] buff = new byte[255];
        NetworkStream stream;
        TcpClient client;
        while(true)
        {
            client = t.AcceptTcpClient();
            if (!client.Connected)
               return;

            stream = client.GetStream();
            while ((stream.Read(buff, 0, buff.Length)) != 0)
            {
                break;
            }

            if (0 != buff.Length)
                break;
        }  
我猜“不断地听”不是读者的任务,而是听者的任务。我在使用TcpListener编写服务器时遇到了同样的问题。我不知道你们想做什么,但我正在发布你们“持续倾听”的解决方案,并阅读byte[]问题。我想这段代码可能会帮助您:

TcpListener t = new TcpListener(IPAddress.Loopback, _port);
        t.Start();

        Console.WriteLine("Server is started and waiting for client\n\n");

        byte[] buff = new byte[255];
        NetworkStream stream;
        TcpClient client;
        while(true)
        {
            client = t.AcceptTcpClient();
            if (!client.Connected)
               return;

            stream = client.GetStream();
            while ((stream.Read(buff, 0, buff.Length)) != 0)
            {
                break;
            }

            if (0 != buff.Length)
                break;
        }  

没有必要转换任何东西
GetStream()
返回网络流。请参阅中Microsoft包含的示例。您所要做的就是替换
myCompleteMessage.AppendFormat(“{0}”,Encoding.ASCII.GetString(myReadBuffer,0,numberOfBytesRead))与适当的存储机制连接。

无需转换任何内容
GetStream()
返回网络流。请参阅中Microsoft包含的示例。您所要做的就是替换
myCompleteMessage.AppendFormat(“{0}”,Encoding.ASCII.GetString(myReadBuffer,0,numberOfBytesRead))使用适当的存储机制连接。

它到底是如何不起作用的?您没有为我们提供足够的信息来处理。消息是什么样子的?它是固定长度的吗?它的前缀是长度吗?它是以换行符分隔的(暗示它实际上可能是文本)?您的第二段代码没有任何消息的概念。我的意思是,while部分将持续读取数据,直到客户端关闭连接,因为它不会检查传入数据流中是否存在分隔符或任何东西。为什么要使用MemoryStream呢?为什么不像对待StreamReader那样,每次都通过内部循环广播缓冲区呢?@Cameron-这是我一直在寻找的答案,但我不知道如何在代码方面解决这个问题。使用StreamReader.readline()这很容易,因为整行以一个块的形式通过,我可以使用if来确定这行不是空的还是空的,但我不确定如何通过连续的流注入来解决它……它何时在哪一点结束,我会使用构建的字节数组并对其进行处理。它到底是如何工作的?你没有给出你的答案s足够的信息可以使用。消息是什么样子的?它是固定长度的吗?它的长度前缀是固定长度的吗?它是以换行符分隔的吗(表明它实际上可能是文本)?您的第二段代码没有任何消息的概念。我的意思是,while部分将持续读取数据,直到客户端关闭连接,因为它不会检查传入数据流中是否存在分隔符或任何东西。为什么要使用MemoryStream?为什么不像y一样每次通过内部循环广播缓冲区你在用StreamReader做什么?@Cameron-这是我一直在寻找的答案,但我不知道如何在代码方面解决这个问题。使用streamreader.readline()很容易,因为整行都是一个块,我可以使用if来确定行是否为空或null,但我不确定如何通过连续的流注入来解决它……它何时在哪一点结束,我会用构建好的字节数组做点什么。太棒了……我就快到了。只是不完全确定如何填充byte[]数组,而不是将数据追加到字符串中。我尝试创建一个列表并添加(myReadBuffer,0,numberofBytesRead),认为这是一个字节,但事实并非如此。我最后只是插入了一个memorystring.write()并将其转换为一个数组……这可能不是最干净的解决方案,但它可以工作。谢谢太棒了…我快到了。只是不完全确定如何填充byte[]数组,而不是将数据追加到字符串中。我尝试创建一个列表并添加(myReadBuffer,0,numberofBytesRead),认为这是一个字节,但事实并非如此。我最后只是插入了一个memorystring.write()并将其转换为一个数组……这可能不是最干净的解决方案,但它可以工作。谢谢