我正在使用一个使用UDP/IP通信来互相发送数据的应用程序。但是现在它正在使用广播。
private void InitializeSender()
{
sendingClient = new UdpClient();
sendingClient = new UdpClient(broadcastAddr, port);
sendingClient.EnableBroadcast = true;
}
public void Sender(string message)
{
if (!string.IsNullOrEmpty(message))
{
string toSend = yourUsername+":"+message;
byte[] data = Encoding.ASCII.GetBytes(toSend);
sendingClient.Send(data, data.Length);
}
}
我想将其切换为专用发送。我有一个List<Dictionary<string, IPEndPoint>> user_ip = new List<Dictionary<string, IPEndPoint>>();
,可以在其中存储用户名和IP组合。但是我不知道如何从另一个应用程序中获取这些数据。如何将用户名/IP信息发送给其他客户端。我应该有广播发现或类似的东西吗?您知道这有什么好的解决方案吗?
最简单,最耐用的解决方案:
- 启动应用程序在用户名端口A上听。内部用户名的每条传入消息都将与发件人的IP一起放入
user_ip
字典中(除外,OFC除外(。 - 它在整个网络上在同一端口A上广播了自己的用户名。此步骤允许其他已经开始记住该新客户端的IP的实例(因为他们已经在听端口A(。
- 它开始以自己的用户名来回答每个传入的用户名,并继续将它们放入
user_ip
中。在关闭应用程序之前,不要停止此行为。这就是为什么在步骤2应用程序之后将收到(希望(同一网络上的客户端的完整列表。
此解决方案有两个主要问题:
- UDP不能确保传递消息,这使整个产品都不可靠。
- 这种方法在整个互联网上不起作用。为了克服此限制,您需要一台可达的服务器,这将负责同步。结合TCP,这也将消除第一个问题。
upd:关于选择TCP与UDP的问题。
TCP提供可靠性,UDP被认为更快(在某些情况下更快(。因此,正确的选择取决于。
还请记住,TCP不允许您进行广播。实际上,这意味着对于TCP,您基本上将有两种选择:
- 有服务器
- 或使用UDP进行同行发现,然后使用TCP传输实际数据。
后者的第一步仍然缺乏可靠性。但是,这个缺陷可能可以通过定期重复步骤2绕过。可以说每5分钟一次,这适合大多数应用程序。
您可以看到,有很多东西(实际上,比我在这里提到的更多(可能是可能的,而且选择在很大程度上取决于实际任务。很难说出哪种方式,因为您没有描述任何要求。
就个人而言,当我不受限制时,我更喜欢采取灵活性路径并选择"客户端服务器"体系结构,因为需求总是可以改变。当客户说"我需要在互联网上工作"时,我已经在那里:)但是这个决定仍然在很大程度上取决于实际任务。