【发布时间】:2019-06-02 13:43:10
【问题描述】:
我正在使用 C# Windows Froms 编写一个聊天应用程序。我的问题是,我的服务器可以向每个连接的客户端发送消息,但只有发送消息的客户端才能收到响应。我尝试创建一个像 ReceiveLoop() 这样的函数,里面有一个无限循环,或者添加一个计时器并为每个滴答声调用 Receive() 函数,但由于应用程序崩溃,两者都没有成功。 如何实时获取数据?我附上了我客户的应用代码。
public partial class Form1 : Form
{
private string name;
private Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private void Namebt_Click(object sender, EventArgs e)
{
if (!Test(Nametb.Text)) Nametb.Text = "Nie wpisano nazwy!";
else
{
name = Nametb.Text;
Nametb.Clear();
Nametb.Enabled = false;
Namebt.Enabled = false;
Messageslb.Enabled = true;
timer1.Start();
LoopConnect();
}
}
private void LoopConnect()
{
int attempts = 0;
while (!_clientSocket.Connected)
{
try
{
attempts++;
_clientSocket.Connect(IPAddress.Loopback, 100);
}
catch (SocketException)
{
Messageslb.Items.Clear();
Messageslb.Items.Add("Connection attempts: " + attempts.ToString());
Messageslb.Refresh();
}
}
Messageslb.Items.Add("Connected!");
Messageslb.Refresh();
Messagetb.Enabled = true;
Sendbt.Enabled = true;
}
private bool Test(string text)
{
if (text != "") return true;
return false;
}
private void Sendbt_Click(object sender, EventArgs e)
{
if (!Test(Messagetb.Text)) Messagetb.Text = "Nie wpisano zadnej wiadomosci!";
else
{
Send();
}
}
private void Receive()
{
if(_clientSocket.ReceiveBufferSize > 0)
{
byte[] receivedBuffer = new byte[1024];
int rec = _clientSocket.Receive(receivedBuffer);
byte[] data = new byte[rec];
Array.Copy(receivedBuffer, data, rec);
Messageslb.Items.Add(Encoding.ASCII.GetString(data));
}
}
private void Send()
{
string message = "[" + name + "]: " + Messagetb.Text;
Messagetb.Clear();
byte[] buffer = Encoding.ASCII.GetBytes(message);
_clientSocket.Send(buffer);
Receive();
}
private void Nametb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return) Namebt_Click(sender, e);
}
private void Messagetb_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return) Sendbt_Click(sender, e);
}
private void timer1_Tick(object sender, EventArgs e)
{
Receive();
}
}
【问题讨论】:
-
如果您正在认真学习低级通信协议,我不想打断您的问题。如果您只是在寻求解决方案,请查看 SignalR 库以创建聊天应用程序。
-
现在,如果你想在循环中接收多个服务器消息,你已经解释了你必须做什么:发送客户端消息 -> 接收服务器消息 -> 发送客户端消息 -> 接收服务器消息-> ...冲洗并重复。此外,您只告诉我们您的程序崩溃并没有向我们提供任何可以帮助我们帮助您的信息。 (两个人说话;一个人:“我的车坏了。如何修理?” 人二:“不知道......它是怎么坏的?”一个:“ 你为什么需要知道?你不能告诉我怎么修吗?”二:“好的,我知道怎么修了。买辆新车” )
-
@elgonzo 通过“崩溃”我的意思是程序没有响应,因为它变成了无限循环。我什至无法通过单击右上角的“X”按钮或“停止编译”按钮来关闭程序。我必须在任务管理器中关闭进程。
-
您是否尝试增加计时器的间隔?
-
我不知道“停止编译”按钮是什么意思。编译器不参与运行程序。我猜你的意思是停止调试会话的按钮。因此,您确定您在调试器中启动了程序吗?即,是否启用了“停止调试”按钮?
标签: c# .net sockets tcp system.net