我正在尝试编写一个简单的客户端 - 服务器应用程序,客户端可以在其中向网络中的一个或所有客户端发送或广播消息。服务器存储连接到它的所有IP地址,并在新客户端自身连接时广播新IP。
我不太确定如何实现向另一个客户端发送单个消息。我是否只需要向服务器发送TCP消息并将所需的收件人作为数据放入TCP层,然后由服务器提取,以便知道将其发送到何处?
我还想为消息添加加密,然后不再允许服务器读取数据,所以我不知道如何解决这个问题!?
我正在使用c ++和Qt5进行实现
答案 0 :(得分:1)
我不太确定如何实现发送单个消息 另一个客户。我只需要向服务器发送TCP消息 然后将所需的收件人作为数据放入TCP层 由服务器提取,以便知道在哪里发送它?
在理想的世界中,客户端可以直接相互通信,因为他们可以从服务器找到其他客户端的IP地址(通过其广播或通过从服务器请求IP地址列表)。如果所有客户端都在同一个LAN上运行,那么这可以很好地运行。
假设您希望系统在普通互联网上运行,那么它不会很好地工作,因为许多/大多数客户端将落后于各种防火墙,因此他们不会接受传入的TCP连接。 (周围有一些ways,但它们需要非常深入地了解TCP的工作原理,即使这样,它们只能在某些情况下工作,所以我不建议在第一个项目中尝试它们< / p>
因此,对于可靠的客户端 - >客户端消息传递机制,最好的办法是让发送客户端将消息发送到服务器,以及一些告诉服务器其他客户端消息的短头。应该转发给。我的own客户端/服务器邮件系统沿着这些方向运行,我发现它运行良好。
我还想为消息添加加密,然后就不会 更长的时间允许服务器读取数据,因此我不确定如何解决 那个!?
在您首先使用基本的非加密功能之前,不要担心添加加密,因为加密会使调试变得更加困难。也就是说,将加密/不透明数据传递到服务器是完全可能的,只要前面提到的头数据(告诉服务器将消息转发到哪里)不加密(因为服务器需要是能够读取标题以了解如何处理加密数据)。更棘手的部分是当接收客户端从服务器获取转发数据时 - 接收客户端将如何解密它?您需要一些外部机制来让客户端共享密钥(对称密钥或公钥/私钥对),因为如果您通过服务器自己发送加密密钥,那么加密任何东西都没有多大意义(因为服务器可以保留它转发的任何密钥的副本,并使用它们解密,如果它想要的话