【问题标题】:Is it possible to connect with client from server是否可以从服务器与客户端连接
【发布时间】:2015-05-21 11:58:27
【问题描述】:

我正在使用 C# 编写 TCP 客户端服务器软件。 我希望客户端在服务器启动后自动与服务器连接。 要执行此任务,客户端可能需要知道服务器是否已启动。 但是如何,有可能吗?

我的情况: 在同一个 LAN 网络上有一个客户端和一个服务器。每个人都知道另一个人的IP地址。 这是在它们之间建立联系的代码部分:

服务器端:

// Starting the Server ...
TcpListener serverSocket = new TcpListener(8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();

...

// Listening for client's connection in a thread ...
while (true)
{
    clientSocket = serverSocket.AcceptTcpClient();
    msg(" The client connected");
}

...

客户端:

// Here, client makes connection to the server when user clicks a button
clientSocket.Connect("192.168.1.1", "8888");

...

【问题讨论】:

  • 简单的解决方案:客户端可以轮询服务器,当发现/握手时你会知道服务器在那里......或者......你可以让服务器广播“我还活着”如果您有正在监听的客户端,则在启动时发送消息。
  • 请阅读stackoverflow.com/help/how-to-ask。您的问题中没有足够的上下文来提供一个好的答案。您的客户端和服务器各自运行的网络环境是什么?他们在同一个局域网上吗?还是互联网上的服务器远离客户端?这需要所有个可能的客户吗?或者它是否足以为服务器已知的客户端工作?服务器多久将其状态从“未启动”更改为“已启动”,反之亦然?使用中间匹配服务器是否可以接受?等等。
  • 感谢您的建议。我按照你的建议提供了我的情况和代码部分
  • 如果这是局域网,则仅使用多播查看流量。

标签: c# tcpclient tcplistener tcpsocket


【解决方案1】:

似乎可能的解决方案之一如下:客户端应该“轮询”服务器,即客户端必须定期尝试连接到服务器,直到建立连接。

要指定“连接”操作的超时时间,请考虑使用TcpClient.BeginConnect Method 和结果的IAsyncResult.AsyncWaitHandle Property 等待“超时事件”。让我们引入一个工厂来封装所描述的功能:

internal static class TcpClientFactory
{
    public static bool TryConnect(string host, int port, TimeSpan timeout, out TcpClient resultClient)
    {
        var client = new TcpClient();
        var asyncResult = client.BeginConnect(host, port, null, null);

        var success = asyncResult.AsyncWaitHandle.WaitOne(timeout);
        if (!success)
        {
            resultClient = default(TcpClient);
            return false;
        }

        client.EndConnect(asyncResult);
        resultClient = client;
        return true;
    }
}

使用工厂的客户端代码如下:

var timeout = TimeSpan.FromSeconds(3);
TcpClient client;
do
{
    Console.WriteLine("Attempting to connect...");
}
while (!TcpClientFactory.TryConnect("host here", port here, timeout, out client));

// Here the connected "client" instance can be used...

另外,请参考这个问题:How to set the timeout for a TcpClient?

【讨论】:

  • 只是一个坚持不懈的人,但轮询并不是唯一的解决方案...... signalR 是一个很棒的框架,它使用多种方法来处理客户端->服务器或服务器->客户端通信
  • @Pseudonym,同意你的看法。答案已更新。谢谢!
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多