Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# socket编程中的客户端到客户端通信_C#_C++_Sockets_Client_Server - Fatal编程技术网

C# socket编程中的客户端到客户端通信

C# socket编程中的客户端到客户端通信,c#,c++,sockets,client,server,C#,C++,Sockets,Client,Server,我正在用c#开发一个聊天应用程序。我已经完成了服务器和客户机之间通信所需的所有工作,但是,我不确定如何才能使客户机能够相互通信 我在网上搜索了很多。事实上,我以前问过几乎相同的问题 现在我知道有两种方法可以完成这项工作 第一种是直接的客户端到客户端通信,其中一个客户端充当另一个客户端的服务器,但是由于系统防火墙可能阻止客户端充当服务器,因此它有一些缺点 第二种方法是让服务器通过从一个客户端接收消息并将其发送到另一个客户端来进行通信。我个人更喜欢这个,因为我认为它必须更可靠,我们可以绝对肯定,信

我正在用c#开发一个聊天应用程序。我已经完成了服务器和客户机之间通信所需的所有工作,但是,我不确定如何才能使客户机能够相互通信

我在网上搜索了很多。事实上,我以前问过几乎相同的问题

现在我知道有两种方法可以完成这项工作

第一种是直接的客户端到客户端通信,其中一个客户端充当另一个客户端的服务器,但是由于系统防火墙可能阻止客户端充当服务器,因此它有一些缺点

第二种方法是让服务器通过从一个客户端接收消息并将其发送到另一个客户端来进行通信。我个人更喜欢这个,因为我认为它必须更可靠,我们可以绝对肯定,信息将被发送和接收。如果我错了,请告诉我

然而,我的问题是,我不知道客户端应该如何让服务器知道他想要与之通信的另一个客户端。 更具体地说,假设客户机A想要与客户机B对话。因此,他使用客户机B的用户名或IP地址向服务器发送请求。现在,服务器应该如何找到客户机B?它是否必须保留客户机列表,并使用例如for语句搜索客户机B?如果有成百上千甚至成百上千的客户端连接到服务器,该怎么办


如果我没有清楚地解释我的问题,请告诉我。非常感谢您的帮助。

一台中央服务器的解决方案听起来不错。一般来说,服务器应该保存一个连接到它的所有客户端的列表。然后,当客户机A想要向客户机B发送消息时,它会向服务器发送一条消息,指定消息应该到达哪个其他客户机

在这种情况下,服务器必须保留连接到它的客户端的列表。以下是它应该如何工作:

  • 客户端A连接到服务器
  • 服务器向客户机发送一个可供其使用的客户机列表
  • 客户端A向服务器发送它要向其发送消息的客户端(客户端B)的名称(或某个id)以及消息
  • 服务器发送客户端B消息

  • 你的问题似乎都有答案。您正确地遵循了需求。你必须跟踪每个客户。如果服务器有几十万个连接,你应该开始考虑一些负载平衡问题。虽然这个问题很广泛,但问起来非常真实和正确。它解决了一个任何人都可能面临的问题,同时他以一种非常精确的方式问道,我不知道为什么这个线程会被关闭以供进一步讨论。我想这个线程一定是被打开的。我偶然发现它在寻找一个类似的解决方案,但我也可以为这个问题提供一个有用的答案。如果讨论是公开的,这本可以对很多人有建设性的帮助。我想你的答案更贴切。当然,服务器应该向客户端A发送连接到它并且可用的客户端列表。例如,当前在客户端A所在的聊天室中的客户端。让我知道我是否正确理解你的想法。一个更可行的方法是实现一种机制,客户在连接后向服务器注册他们的服务。然后,当任何客户机需要服务时,它可以将服务请求传递给服务器(使用所需的参数等),服务器可以将请求路由到服务客户机,并将响应路由回请求客户机。这样就不需要每个客户机了解所有其他连接的客户机以及每个客户机愿意提供的服务。不幸的是,这个线程是关闭的,否则这将是一个更详细的答案。