c# TCP客户端自动连接到服务器监听特定端口

本文关键字:监听 服务器 客户端 TCP 连接 | 更新日期: 2023-09-27 18:19:02

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

现在我能让客户端连接到服务器的唯一方法是通过手动指定服务器的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();
    }

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

所以,我的问题是:让我的客户端自动连接到LAN上运行的服务器的最佳方法是什么?

谢谢,帕特里克



我尝试实现一个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);
        }
    }

我想那里一定有一些冲突的代码,但是因为我是这么新的,我似乎不能弄清楚…



在这方面我还没有取得任何进展。有没有人可以插话帮我弄清楚为什么这对我不起作用?

c# TCP客户端自动连接到服务器监听特定端口

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

c#如何使用UDP广播进行网络发现