我正在创建一个套接字服务器,需要持续监听来自连接客户端的传入消息。这些消息将以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
答案 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));
行。