【发布时间】:2016-03-30 05:31:45
【问题描述】:
我已经创建了两个应用程序(一个客户端和一个服务器),只要我将运行服务器应用程序的机器的本地 IP 地址输入到客户端应用程序(在代码中),它们就可以相互通信。
我希望客户端应用程序自动发现运行服务器应用程序的机器的本地 IP 地址并连接到它,这样它们就可以在任何网络上运行,而无需在代码中输入 IP。
这两个应用程序都在同一个网络上运行(即通过 WiFi,而不是 Internet)
这是我目前在客户端应用程序中的内容:
// COMMUNICATE WITH SERVER
private TcpClient client = new TcpClient();
private IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.2.35"), 8888);
public Console()
{
InitializeComponent();
client.Connect(serverEndPoint);
}
private void SendMessage(string msg)
{
NetworkStream clientStream = client.GetStream();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes(msg);
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
}
在此示例中,我只能连接到运行在“192.168.2.35”上的服务器,我希望它能够在网络上的任何机器上找到运行在端口 8888 上的服务器。
或者,如果这不可能,我希望服务器将其 IP 作为消息(某种形式)广播,并让客户端接收此消息并验证它是服务器并连接到它。
我认为我的第二个示例是执行此操作的正确方法,但我似乎无法理解如何使其工作(我对 C# 还很陌生),以及我发现的任何其他示例我似乎无法使用我的应用程序。
这是我的服务器代码,如果它有助于回答我的问题:
private void Server()
{
this.tcpListener = new TcpListener(IPAddress.Any, 8888);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
}
private void ListenForClients()
{
this.tcpListener.Start();
while (true)
{
TcpClient client = this.tcpListener.AcceptTcpClient();
connectedClients++;
lblNumberOfConnections.Text = connectedClients.ToString();
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
clientThread.Start(client);
}
谢谢
编辑:我尝试将THIS 添加到我的项目中,但由于太新,我不确定如何正确实施它,而且它没有让我得到任何结果。
第二次编辑:我已经尝试过几次实现 UDP 广播,但都没有成功。我最近的尝试是实现THIS(减去聊天部分)。我似乎根本无法让 UDP 广播与我的项目一起工作,因为以我目前的技能水平,这似乎超出了我的想象。不幸的是,让我的客户端自动连接到服务器对于我的项目运行来说是 100% 的必要条件......
我的另一个问题,也许最好开始一个单独的问题,但与这个问题有些相关的是:我的客户端 GUI 由一个面板组成,该面板在多个自定义类之间切换,每个类都包含不同的按钮等(工作类似到标签页)与我尝试连接的服务器通信。一旦我弄清楚了 UDP 广播,我是否需要将它分别编码到每个类中?或者有没有办法让我的面板中运行的所有类都连接到同一台服务器?
【问题讨论】:
-
有人对此有任何指示吗?这是阻碍我参与这个项目的 RC 的主要问题......