【问题标题】:How to read a string from C# socket? [closed]如何从 C# 套接字读取字符串? [关闭]
【发布时间】:2020-11-01 17:38:15
【问题描述】:

我是 C# 的新手,所以请注意这一点。目前我正在编写一个程序,其中服务器向我发送消息,格式为 JSON 字符串。如何从该套接字的输入流中读取字符串?

【问题讨论】:

  • 有很多关于从套接字读取数据的信息。您的问题未能提供任何证据表明您已经进行了任何研究或尝试了任何事情。请说明您尝试了哪些方法,以及具体您需要什么帮助。 Stack Overflow 不是一个教程网站,像这样过于宽泛的问题是不合适的。

标签: c# sockets stream


【解决方案1】:

您可以使用 newtonsoft 将 JSON 字符串反序列化为正确的对象

【讨论】:

  • 虽然这是 true,但它并没有真正解决问题的上下文。
【解决方案2】:

您可以使用NetworkStream 获得一个Stream 形式的套接字(用于最常见的序列化程序);但是,有一个非常重要的事情需要考虑:“框架”。由于您说“消息”(而不是“消息”),因此听起来多个有效负载将在同一个套接字上发送。 TCP 只是表示一个有序的字节流;如果您要发送一条消息,这很容易 - 只需将 NetworkStream 传递给您选择的解串器,然后:工作完成。但是,如果您想通过单个连接传输多个有效负载,则不是那么容易,因为两端需要就如何知道每个有效负载的开始和结束位置达成一致,这就是“框架”。对于文本协议,一种常见的成帧机制可能是使用标记终止每个有效负载,例如行尾(CR/LF 的某种组合)或空字符(字节零)。对于二进制协议,这通常意味着在每条消息之前使用长度前缀(以约定的格式)。不幸的是,在这两种情况下,您通常都需要缓冲流,直到获得完整的有效负载(注意您最终可能会得到“有效负载和下一个有效负载的一部分”或类似内容),并使用MemoryStream(或类似内容) 依次在每个缓冲帧上。

请注意,您也可以使用StreamReader 通过Encoding 访问Stream 形式的string;如果您的反序列化器采用 TextReaderstring,这可能会很有用。

最近,“管道”API 可以替换 Stream 隐喻,但是 a:并非所有序列化程序都支持“管道”,并且 b:这是一个相当高级的主题,因此对于“非常新C#”的原因;但如果你有兴趣,我有一个多部分的博客系列here

【讨论】:

  • 是的,我完全站在你这边。可悲的是,我得到的网络标准真的很糟糕,没有定义消息端的令牌......
  • @F_Schmidt 那么......您希望如何对数据进行分区?您是否只想计算大括号并寻找将您带回零的}](因为您提到了JSON)?
  • 我猜是这样......
猜你喜欢
  • 2012-10-22
  • 2015-03-07
  • 2022-06-16
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
相关资源
最近更新 更多