如果用户用户存在,则关闭socket

时间:2012-12-18 17:02:24

标签: c# sockets

我正在尝试为学校项目创建服务器/客户端应用程序。

我在给定端口上有一台服务器,连接了多个用户,每个用户都有自己的用户名。

现在我想检查尝试连接的用户是否使用有效的用户名。例如,如果已经连接了具有用户名A的用户,则想要连接的新用户不能使用用户名A.

如果发生这种情况,服务器会使用错误代码响应新客户端。

这是此部分的代码:

   private void Receive()
    {
        while (true)
        {
            byte[] buffer = new byte[64];
            socket.Receive(buffer);
            string received = Encoding.Default.GetString(buffer);
            if (received.IndexOf("!error") != -1)
            {
                string[] mySplit = received.Split(':');
                string errorCode = mySplit[1].Trim((char)0);
                if (errorCode == "user exists")
                {
                    richTextBox1.AppendText("Your connection was refused by server, because there's already another user connected with the username you choose");
                    socket.Disconnect(true);

                    connectBtn.Enabled = true;
                }
            }
        }
    }

当我尝试这样做时,程序崩溃,而visual studio表示存在无效 richTextBox1上的跨线程操作。

1 个答案:

答案 0 :(得分:4)

您只能从UI线程访问UI元素。如果您尝试从后台线程访问它们,您将获得此异常。此代码需要在后台线程中运行,以便您不会永久阻止UI线程并冻结您的应用程序。

有几种方法可以编组回UI线程,其中一部分取决于您决定首先启动后台线程的方式。 (如果你正在使用BackgroundWorker, Tasks, await`等,那么就有内置的方法。)

一个通用选项是仅使用Invoke

if (errorCode == "user exists")
{
    this.Invoke(new Action(()=> { DisplayError(); } ));
}
然后,

DisplayError可以包含针对此情况的所有UI代码。请注意,通常最好将UI代码与业务逻辑分开。在整个应用程序中嵌入UI代码是不可取的。