C#TCP客户端自动连接到侦听特定端口的服务器

时间:2015-10-24 18:11:00

标签: c# server client connect

我似乎很难弄清楚如何让我的客户端应用程序自动连接到在我的LAN上的单独机器上运行的服务器应用程序。

现在,我能够让客户端连接到服务器的唯一方法是在代码中手动指定服务器的IP地址:

 private TcpClient client = new TcpClient();
 private IPEndPoint serverEndPoint = neIPEndPoint(IPAddress.Parse("Server IP address goes here"), 8888);

我的服务器应用程序使用TCP侦听器,所以我认为我的客户端可以做类似的事情,以便能够找到服务器,但我无法弄清楚如何在代码中实现它。

来自我的服务器应用程序的代码,用于查找要连接的客户端:

private TcpListener tcpListener;
    private Thread listenThread;
    private int connectedClients = 0;
    private delegate void WriteMessageDelegate(string msg);

    public Form1()
    {
        InitializeComponent();
        Server();
    }

    private void Server()
    {
        this.tcpListener = new TcpListener(IPAddress.Any, 8888); 
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();
    }

我尝试使用TextBox,用户可以手动输入服务器的IP地址(因为他们无法访问代码),但我认为自动连接会更加用户友好,特别是因为我如果他们使用上述设置客户端连接的IP的方法,则不知道如何永久保存用户的服务器IP地址。

所以,我的问题是:对我来说,最好的方法是让我的客户端自动连接到局域网上运行的服务器?

谢谢,

帕特里克

更新

我尝试为UDP广播实现代码,但我似乎无法使其正常工作。

以下是我添加到客户端的内容(以及之前的客户端代码):

public partial class Console : Form
{

    //FIND SERVER

        private void FindServer()
    {
        var Client = new UdpClient();
        var RequestData = Encoding.ASCII.GetBytes("SomeRequestData");
        var ServerEp = new IPEndPoint(IPAddress.Any, 0);

        Client.EnableBroadcast = true;
        Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, 8888));

        var ServerResponseData = Client.Receive(ref ServerEp);
        var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);
        Console.WriteLine("Recived {0} from {1}", ServerResponse, ServerEp.Address.ToString());

        Client.Close();
    }


    // SEND MESSAGES TO SERVER (VIA USER INTERACTION)

    private TcpClient client = new TcpClient();
    private IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("My IP Address was here (I tried changing it to "broadcast" as well"), 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();

    }

以下是我添加到服务器代码中的内容:

private void BroadcastToClients()
    {
        var Server = new UdpClient(8888);
        var ResponseData = Encoding.ASCII.GetBytes("SomeResponseData");

        while (true)
        {
            var ClientEp = new IPEndPoint(IPAddress.Any, 0);
            var ClientRequestData = Server.Receive(ref ClientEp);
            var ClientRequest = Encoding.ASCII.GetString(ClientRequestData);

            Console.WriteLine("Recived {0} from {1}, sending response", ClientRequest, ClientEp.Address.ToString());
            Server.Send(ResponseData, ResponseData.Length, ClientEp);
        }
    }

我想在那里肯定会有一些冲突的代码,但由于我对此很陌生,我似乎无法弄清楚......

更新 我还没有在这方面取得任何进展。那里的任何人都可能能够帮助我找出为什么这对我不起作用?

1 个答案:

答案 0 :(得分:2)

您的客户端应用程序可以在启动时在本地子网上发送广播,“请求服务器”。 您的服务器将侦听该消息,并回复客户端。 现在,客户端知道服务器的IP地址,并可以启动TCP连接。

你在这里:C# How to do Network discovery using UDP Broadcast