【问题标题】:Can you pass a Stream object to a method to write to that specific stream?您可以将 Stream 对象传递给方法以写入该特定流吗?
【发布时间】:2016-04-20 13:52:41
【问题描述】:

我目前有一个服务器和两个与之通信的客户端。每次客户端连接到服务器时,我都会将 Stream 实例作为值存储,并将客户端 ID 作为键存储在并发字典中。

private static ConcurrentDictionary<string, NetworkStream> pumpIDAndStream = new ConcurrentDictionary<string, NetworkStream>();

//then later in the program

pumpIDAndStream.AddOrUpdate(clientID.ToString(), stream, (k, v) => stream);

然后我使用此方法尝试根据存储在字典中的流对象向特定客户端实例发送消息:

private void proceedPump(byte[] b_recievedLine)
{

    string s_messageBody = DESDecrypt(b_recievedLine, DCSP);
    string[] delim = { " " };
    string[] strings = s_messageBody.Split(delim, StringSplitOptions.RemoveEmptyEntries);


    NetworkStream pumpStream = pumpIDAndStream[(strings[0])]; //strings[0] is the specific client ID
    byte[] empty = System.Text.Encoding.ASCII.GetBytes(""); 

    pumpStream.Write(messageFormatting(empty, 0x14, DCSP), 0, empty.Length);
    pumpStream.Flush();

}

调试后,它确实到达了pumpStream.Flush();,但在特定客户端上没有任何内容。有什么指点吗?

【问题讨论】:

  • @CharlesMager Empty 只是消息体,messageformatting 方法返回一个字节数组,其前缀为消息类型(0x14)的标头。 Empty 只是空的,因为我不想处理传递共享密钥进行解密,真正的事情是在标头中发送 0x14 字节。
  • 您仍在使用它的长度作为计数参数 - 请参阅下面的答案。

标签: c# networking stream client


【解决方案1】:

你没有写任何东西。

empty 是一个空数组,您对Write 的调用使用它的长度(0)作为要写入的字节数(请参阅the docs - 您将count 指定为@987654326 @)。

你可能想做这样的事情:

var bytesToWrite = messageFormatting(empty, 0x14, DCSP);
pumpStream.Write(bytesToWrite, 0, bytesToWrite.Length);

【讨论】:

  • 我收回我的评论。发现得好!这看起来正是问题所在以及如何解决它。
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 2012-03-18
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 2017-10-09
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多