为了在 c# 中创建局域网信使,我需要使用相同的局域网信使软件明显地在线检测主机。我试图寻找这样做的起点,但徒劳无功。我需要知道如何开始工作。
7 回答
我过去有两种方法:让所有客户端连接到预定义的主机(简单,但需要一些客户端配置)和让主机(或客户端)通过“广播”地址广播它们的存在(例如, 10.0.255.255)(硬,防火墙/NAT 会让生活变得痛苦,客户端不需要配置)。
但是,是的——如果 WCF 实现了一个发现协议,那就去吧。如果它做你想做的事,它可能比你(或大多数人,就此而言)可以写的任何东西都要好。
您可以使用 Windows 连接基础吗?如果是这样,您可以使用 WCF 来实现 WS-Discovery 协议。这是一个简短的操作方法。
根据您是否计划依赖集中式服务器,您可以选择:
1)无服务器:当客户端上线时,他会广播自己的身份,要求其他客户端发送他们的身份。
2)集中服务器:一个新的客户端连接,他注册到服务器并下载客户端列表。然后通知每个客户端(通过轮询,如果使用 WCF,则通过双工合同,或通过基本套接字连接)新客户端。
第一个版本将基于 UDP 套接字。请注意,这不适用于本地网络,因为我相信这些数据包不会通过路由器。这也可能是一个糟糕的设计,因为大量客户端只会用数据包淹没网络。但是,嘿,这对你来说可能就足够了。
WCF 还提供点对点支持,您可能会感兴趣。这是一篇关于它的文章。
您可能喜欢使用 ZeroConf aka Bonjour、Rendevous 或有时是 Avahi。
使用我在 LAN Messenger 中使用的这个 GetComputers() 方法
using System.Diagnostics;
public static string[] GetComputers()
{
//Process that retrieves the net view >> list of computers on the network
Process proc = new Process();
proc.StartInfo.FileName = "net.exe";
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.Arguments = "view";
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
//Reads the output of the net view.
StreamReader sr = new StreamReader(proc.StandardOutput.BaseStream);
string line = "";
List<string> names = new List<string>();
while ((line = sr.ReadLine()) != null)
{
if (line.StartsWith(@"\\"))
names.Add(line.Substring(2).Split(' ')[0].TrimEnd());
}
sr.Close();
proc.WaitForExit();
//Array that contains computer names
string[] computerNames = new string[names.Capacity];
int i = 1;
//Adds computers names to the list view
foreach (string name in names)
{
computerNames[i] = name;
i++;
}
return computerNames;
}
您可以让您的应用程序在预定义的端口上侦听,当有人连接到该端口时,会发回某种确认,例如应用程序名称和 IP。
因此,当一个新客户端上线时,它会发送一个广播,一个 UDP 数据包广告它的 IP。其他客户端将在相关端口上侦听这些“公告”,并将其自己的 IP(通过其他端口)发送回发送者。因此,现在 LAN 上所有正在运行的客户端将使用其 IP 联系初始发送者。其他客户端也可以记录“通知”发送者的 IP - 这也可以让他们保持网络上其他客户端的最新列表。
为了使列表保持最新,您可以让所有客户端以半随机间隔(例如每分钟 + rand(10) 秒)在网络上广播它们的存在。
以上所有内容都假设您正在谈论同一网络上的客户端。如果您在 Internet 上执行此操作,则需要一些中心点来跟踪已登录客户端的 ips。
我认为可以ping通广播ip并得到每个人的答复。或类似的东西。可以从那开始,然后检查客户端是否正在侦听某个端口或其他东西。
另一种方法是让客户端告诉服务器“我们还在这里!” 每隔一段时间。