【问题标题】:C#: How to send Username, Time and Message via TCP to TCPListenerC#:如何通过 TCP 向 TCPListener 发送用户名、时间和消息
【发布时间】:2021-10-28 19:06:15
【问题描述】:

我对 Socket 编程很陌生,我开始做的第一件事就是在服务器和客户端之间进行简单的终端聊天。我想知道您如何通过 TCP 连接一次性发送整个消息数据(用户名、时间、消息等)。

我的第一次尝试是使用: 拆分数据,然后根据需要显示块,但我意识到它会阻止用户使用冒号。

第二个猜测是序列化......仍然不确定在流中发送多个字符串的最佳解决方案是什么。

提前致谢

【问题讨论】:

  • 使用这么低级的技术,给你带来一堆低级的问题。有更成熟的技术可能更适合您的情况,例如 wep apis、signalr、grpc,仅举几例,虽然它们看起来效率较低且学习曲线较陡,但我可以保证您获得 tcp 解决方案健壮并按照您想要的方式工作将需要更长的时间,并且在许多方面可能会逊色。更不用说在 Visual Studio 中通常有模板以及许多教程和演练可以帮助您
  • 为了让用户在使用你的分隔方法时使用冒号,你可以在你的协议中使用字符转义。如果用户键入:,则在发送之前将其替换为例如\:。然后,对方站点必须在显示消息之前还原此过程。

标签: c# tcp


【解决方案1】:

我同意 TheGeneral 的观点,即您可能不想在大多数应用程序中使用普通套接字;但是,如果您只是制作聊天程序来学习套接字,我建议您将数据序列化(例如使用 JSON)。使用Newtonsoft.json nuget package,您可以将带有任何数据的结构或对象转换为 JSON 并在另一端反序列化它。有很多例子说明如何只用几行代码来做到这一点。提出自己的协议通常是一个非常糟糕的主意。我从经验中知道。

对于密码,这取决于您想要多少安全性。由于这只是为了学习套接字编程而不是用于生产,我建议您只使用哈希将密码作为纯文本发送。 MD5 是最简单的,但它不再安全。 SHA-256 仍然被认为是安全的。

如果您想要更好的安全性,请考虑使用Secure Remote Password protocol (SRP) Kerberos 协议。

一旦你学会了套接字,你就可以尝试使用像 SignalR 这样的库,它本身就支持身份验证头。

【讨论】:

    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 2016-07-16
    • 2018-04-13
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多