-1

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

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

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

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

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

你可以使用 TcpClient 和 TcpListener ...

4

1 回答 1

3

我这样做:

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)

于 2013-01-13T17:46:24.353 回答