【问题标题】:How to understand whether client connected to server in c#?c#中如何理解客户端是否连接到服务器?
【发布时间】:2013-11-10 21:30:40
【问题描述】:

我正在尝试使用套接字在客户端和服务器之间建立连接。我有一个图形用户界面。这是我的代码:

这是服务器的代码,它从 gui 的文本框中获取端口号,当点击开始按钮时,会创建一个套接字。

Thread thrAccept;
Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket n;

private void button_start_listening_Click(object sender, EventArgs e)
{
    richTextBox_server_activity_log.AppendText("Server started. Waiting for clients... \n");
    button_start_listening.Enabled = false;
    server_socket.Bind(new IPEndPoint(IPAddress.Any, Convert.ToInt32(textbox_port_no.Text)));

    server_socket.Listen(100);
    thrAccept = new Thread(new ThreadStart(Accept));
    thrAccept.Start();

}

private void Accept()
{
    n = server_socket.Accept();            
}

对于客户端,我使用两个文本框输入用户的 ip 和端口号,然后单击连接按钮,并建立连接,我使用这段代码:

c.Connect(ipText.Text, Convert.ToInt32(portText.Text)); //c is a socket

我的问题是,建立连接后,我想在服务器的 GUI 中打印类似“客户端已连接”的内容。但是如何让服务器知道客户端已连接?

谢谢

【问题讨论】:

  • 您的问题是什么? Socket.Accept 方法会阻塞,直到它可以接受来自远程主机的连接。因此,在您的 Accept 方法结束时,您可以说“客户端已连接”.. 因为此时它已接受连接。
  • @SimonWhitehead 谢谢,我不知道它在接受连接之前会阻塞,我会试试的
  • 这就是为什么你不得不把它放在它自己的线程中。否则你的用户界面会没有响应。
  • @SimonWhitehead 只是一个简单的问题:我在客户端的 GUI 中还有一个文本框,客户端可以输入用户名。如何将此用户名参数传递给服务器,以便服务器也显示连接的客户端的用户名?我将客户端和服务器 GUI 保存在不同的项目中
  • 你不能一次爆发。最初,套接字将接受连接 - 带有远程主机 IP/主机名等。之后,您需要向客户端发送请求以获取他们的用户名。

标签: c# sockets networking network-programming


【解决方案1】:

也许是这样的?

   private void Accept()
    {
        try {
            n = server_socket.Accept();
            richTextBox_server_activity_log.AppendText("Connection Established...");
        } catch (Exception ex) {
            richTextBox_server_activity_log.AppendText("Failed to Connect...");
        }
    }

【讨论】:

  • 谢谢,但我不是使用 Console.Writeline,而是在 gui 的 Richtextbox 中处理消息
  • 此方法在单独的线程中运行。像这样使用 RichTextBox 可能会引发跨线程异常。
猜你喜欢
  • 2012-11-12
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2013-05-18
  • 2012-05-22
相关资源
最近更新 更多