我的服务器/客户端项目不工作
my server / client project not working
我在 c# 中有一个带套接字的服务器项目和一个带套接字的客户端项目,当我启动我的服务器项目时,我的表单无法正常工作,就像锁一样。
请帮助我...
如何解决我的表单有效且文本框显示消息?
private void button1_Click(object sender, EventArgs e)
{
try
{
port = 11000;
ip = IPAddress.Any;
IPEndPoint ipLocal = new IPEndPoint(ip, port);
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketServer.Bind(ipLocal);
socketServer.Listen(10);
buffersize = 1024;//از این سایزه همه چی از گووره این در می آد
newClient = socketServer.Accept();
while (true)
{
buffer = new byte[buffersize];
recv = newClient.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (recv != 0)
{
message = Encoding.ASCII.GetString(buffer, 0, recv);
textBox1.Text += message;
//socketServer.Close();
//newClient.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在客户端:
private void button1_Click(object sender, EventArgs e)
{
try
{
bufferSize = 1024;
ip = IPAddress.Parse("192.168.1.10");
port = 11000;
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipEnd = new IPEndPoint(ip, port);
socketClient.Connect(ipEnd);
while (true)
{
buffer = new byte[bufferSize];
message = textBox1.Text;
buffer = Encoding.ASCII.GetBytes(message);
snd = socketClient.Send(buffer, 0, buffer.Length, SocketFlags.None);
//socketClient.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在您的服务器中:
您的问题是由于 Socket.Recieve() read 的阻塞性质造成的。
它说:
If no data is available for reading, the Receive method will block until data is available
而你 运行 在同一个 UI 线程中,所以你觉得 UI 被冻结了。
解决方案:将您的套接字函数转移到另一个线程。要更新文本框,请使用 Invokes。
同样在您的服务器和客户端实现中,您 运行 一个 while 无限循环。由于他们在 UI 线程中 运行ning,您会感到冻结。
您的应用程序被锁定是因为您的单击事件处理程序中存在无限循环。您将必须启动一个线程来执行读写操作,以免阻塞您的主可视化线程。
我在 c# 中有一个带套接字的服务器项目和一个带套接字的客户端项目,当我启动我的服务器项目时,我的表单无法正常工作,就像锁一样。 请帮助我...
如何解决我的表单有效且文本框显示消息?
private void button1_Click(object sender, EventArgs e)
{
try
{
port = 11000;
ip = IPAddress.Any;
IPEndPoint ipLocal = new IPEndPoint(ip, port);
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketServer.Bind(ipLocal);
socketServer.Listen(10);
buffersize = 1024;//از این سایزه همه چی از گووره این در می آد
newClient = socketServer.Accept();
while (true)
{
buffer = new byte[buffersize];
recv = newClient.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (recv != 0)
{
message = Encoding.ASCII.GetString(buffer, 0, recv);
textBox1.Text += message;
//socketServer.Close();
//newClient.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在客户端:
private void button1_Click(object sender, EventArgs e)
{
try
{
bufferSize = 1024;
ip = IPAddress.Parse("192.168.1.10");
port = 11000;
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipEnd = new IPEndPoint(ip, port);
socketClient.Connect(ipEnd);
while (true)
{
buffer = new byte[bufferSize];
message = textBox1.Text;
buffer = Encoding.ASCII.GetBytes(message);
snd = socketClient.Send(buffer, 0, buffer.Length, SocketFlags.None);
//socketClient.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在您的服务器中:
您的问题是由于 Socket.Recieve() read 的阻塞性质造成的。
它说:
If no data is available for reading, the Receive method will block until data is available
而你 运行 在同一个 UI 线程中,所以你觉得 UI 被冻结了。
解决方案:将您的套接字函数转移到另一个线程。要更新文本框,请使用 Invokes。
同样在您的服务器和客户端实现中,您 运行 一个 while 无限循环。由于他们在 UI 线程中 运行ning,您会感到冻结。
您的应用程序被锁定是因为您的单击事件处理程序中存在无限循环。您将必须启动一个线程来执行读写操作,以免阻塞您的主可视化线程。