【发布时间】: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