为包含byte []数组的传入套接字流创建“侦听器”

时间:2012-02-01 17:38:55

标签: c# sockets stream memorystream

我正在创建一个套接字服务器,需要持续监听来自连接客户端的传入消息。这些消息将以byte []数组发送。我使用StreamReader使服务器运行良好,但StreamReader仅适用于正在发送的数据的文本表示...而不是byte []数组。

这就是我所拥有的:

        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)循环并不能完全满足我的需要。任何人都可以帮助我进行一些代码调整,以使我的工作正常运行。它需要持续监听传入的消息,然后当收到消息时,它需要对该消息(byte []数组)执行某些操作,然后再返回监听。

TIA

2 个答案:

答案 0 :(得分:3)

我猜“连续听”不是读者的任务,而是听众的任务。我在使用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;
        }  

答案 1 :(得分:0)

没有必要转换任何东西。 GetStream()返回NetworkStream。请参阅NetworkStream.Read Method中的Microsoft包含的示例。您所要做的就是用适当的存储机制替换myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));行。