【问题标题】:Socket that constantly listens [closed]不断监听的套接字[关闭]
【发布时间】:2013-01-14 02:45:28
【问题描述】:

所以我为此搜索了大约 2 周,但找不到任何合法答案。

我有两个项目,一个是服务器,另一个是客户端。

我只设法制作了一个客户端控制台应用程序,它只向服务器发送一次数据然后退出。没有别的了。

那么我如何制作一个客户端,通过网络将字符串从文本框发送到服务器,并且服务器不断监听。总是听。不仅侦听一次并完成程序,而且等待连接,当建立连接时,服务器接受客户端的字符串,将字符串写入或写入文本框,然后立即返回侦听连接。

我正在使用 Windows 窗体应用程序,所以我不想要控制台应用程序示例。

你可以使用 TcpClient 和 TcpListener...

【问题讨论】:

  • 一个建议是在Socket 类上使用BeginReceive 和EndReceive。然后在你的回调处理程序中再次调用BeginReceive。

标签: c# sockets tcpclient tcplistener


【解决方案1】:

我是这样做的:

void Loop()
{
    TcpListener l = new TcpListener(IPAddress.Any, Port);
    WaitHandle[] h = new WaitHandle[2];
    h[0] = StopEvent;

    WriteInfo("Listening on port {0}", Port);

    l.Start();
    while (true)
    {
        var r = l.BeginAcceptTcpClient(null, null);
        h[1] = r.AsyncWaitHandle;
        // Wait for next client to connect or StopEvent
        int w = WaitHandle.WaitAny(h);
        if (w == 0)  // StopEvent was set (from outside), terminate loop
            break;
        if (w == 1)
        {
            TcpClient c = l.EndAcceptTcpClient(r);

            c.ReceiveTimeout = 90000;
            c.SendTimeout = 90000;

            // client is connected, spawn thread for it and continue to wait for others
            var t = new Thread(ServeClient);
            t.IsBackground = true;
            t.Start(c);
        }
    }
    l.Stop();

    WriteInfo("Listener stopped");
}

Loop 是在这样的地方开始的:

    StopEvent = new ManualResetEvent(false);
    LoopThread = new Thread(Loop);
    LoopThread.Start();

StopEvent 用于终止监听循环。 ServeClient 作为名称表示已连接的客户端,如下所示:

    void ServeClient(object State)
    {
        TcpClient c = (TcpClient)State;

        NetworkStream s = c.GetStream();
        try
        {
             // Communicate with your client
        }
        finally
        {
            s.Close();
            c.Close();
        }
    }

这适用于任何 .NET 应用程序(Windows 服务、控制台、WPF 或 WinForms)

【讨论】:

  • 使用异步 tcp 客户端/服务器还有另一种可能性,我认为它更舒服。也适用于线程:使用布尔变量中止 while 循环。否则,您必须使用 Thread.Abort() 强制退出它,这是一件坏事。 ;) 异步 tcp 客户端的好例子:robjdavey.wordpress.com/2011/07/29/…
  • 是的,Neurodefekt,我希望看到一些关于异步套接字和 tcp 的解释。介意在这里分享一些例子吗?
  • 只要设置了 StopEvent,所示的 while 循环就会优雅地终止。没有必要中止它。可以使用类似的方法来终止此处未显示的客户端线程
  • @Cofi 查看BeginAcceptTcpClient 的文档,其中指出:开始异步操作以接受传入的连接尝试。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2011-02-15
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多