不断听的套接字

时间:2013-01-13 17:37:25

标签: c# sockets tcpclient tcplistener

所以我已经搜索了大约2周的时间,我找不到任何合法的答案。

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

我只设法创建一个客户端控制台应用程序,它只将ONCE数据发送到服务器,然后退出。没别了。

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

我使用的是Windows窗体应用程序,所以我不想要一个控制台应用程序示例。

您可以使用TcpClient和TcpListener ...

1 个答案:

答案 0 :(得分:2)

我这样做:

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)