允许客户端应用自动连接到同一网络上的服务器应用

时间:2015-12-23 18:15:27

标签: c# server ip client

我创建了两个应用程序(客户端和服务器),只要我将运行服务器应用程序的计算机的本地IP地址输入客户端应用程序(代码中),就可以相互通信。 / p>

我希望客户端应用程序能够自动发现运行服务器应用程序的计算机的本地IP地址并连接到它,这样它们就可以在任何网络上运行,而无需在代码中输入IP。

这两个应用程序都在同一个网络上运行(即通过WiFi,而不是互联网)

以下是我目前在客户端应用中的内容:

// 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广播,我是否需要将它分别编码到每个类中?或者有没有办法让我的面板中运行的所有类连接到同一台服务器?

1 个答案:

答案 0 :(得分:1)

一个简单但可能代价高昂的(就网络流量而言)解决方案是您的服务器应用程序通过UDP广播它的应用程序和连接信息。您的客户端可以侦听具有您的服务器自定义标头的所有广播数据包。假设建立连接,您可以停止广播。缺点是,如果客户端未连接,您将不得不继续广播,如果对广播速度没有限制,这可能会阻塞您的网络。

编辑:以下是MSDN文章https://msdn.microsoft.com/en-us/library/tst0kwb1(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

生成的简要说明

编辑#2:我已经在我的博客上扩展了这个答案,并提供了可下载的示例项目。该文章可在http://martialdeveloper.com/wordpress/?p=21

找到

<强> 1。找到您网络的广播IP

使用UDP时,必须使用特殊的“广播地址”,以便将数据报发送到连接到给定网络的所有计算机。例如,192.168.0.1的典型家庭网络主机/网关的广播地址为192.168.0.255。如果您的网络与此不同,您可以使用IPv4广播地址计算器,如此处http://jodies.de/ipcalc 或者阅读MSDN上介绍广播地址的介绍部分。 https://msdn.microsoft.com/en-us/library/tst0kwb1(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

<强> 2。选择收听/广播端口

客户端上免费提供的任何端口&amp;服务器很好。 MSDN示例使用11000.此端口号用于您的广播公司和监听器。

第3。听众代码

读者注意。为清楚起见,省略了所有错误处理。

int listenPort = 11000;
bool done = false;

UdpClient listener = new UdpClient(listenPort);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any,listenPort);


while (!done) // This loop listens for your broadcast packets
{
    Console.WriteLine("Waiting for broadcast");
    byte[] bytes = listener.Receive( ref groupEP);

    Console.WriteLine("Received broadcast from {0} :\n {1}\n",
            groupEP.ToString(),
            Encoding.ASCII.GetString(bytes,0,bytes.Length));
}
listener.Close();

注意:Console.WriteLine的第三个参数,&#34; Encoding.ASCII ...&#34;表示在数据报包中通过UDP发送的字符串值。这包含发现情况的所需协商信息,例如您要连接的客户端或服务器的IP地址。

<强> 4。广播代码

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
            ProtocolType.Udp);

IPAddress broadcast = IPAddress.Parse("This string should be the broadcast IP address");  //NOTE: Broadcast IP goes here!!

byte[] sendbuf = Encoding.ASCII.GetBytes("This is the message string to be broadcast"); //Your message to the client/server goes here, I.E. an
         // app/client name or ID and an IP to connect with over TCP

IPEndPoint ep = new IPEndPoint(broadcast, 11000);

s.SendTo(sendbuf, ep);

Console.WriteLine("Message sent to the broadcast address");

注意:这是一个非常简单的例子。广播公司可能需要重播一段时间以确保听众收到它。即使在发送/接收UDP数据报之后,也需要进行一些协商以确保正确建立TCP连接。