C# C聊天应用程序

C# C聊天应用程序,c#,C#,您好,我有一个聊天应用程序,不知道我哪里出了问题,我所做的只是每秒钟做一个计时器,它更新消息,m iageva static int witch=1或=0来更新消息。。当他们发送新消息时,它会将其更新为1。代码很奇怪,有时我会收到两次所有消息,有时他们不会发送 我只是想知道是否还有其他方法可以做到这一点,你们中的任何人都知道,比如教程或建议 我的代码: 我在按钮上插入消息的代码 using (SqlDatabaseClient client = SqlDatabaseManager.GetCli

您好,我有一个聊天应用程序,不知道我哪里出了问题,我所做的只是每秒钟做一个计时器,它更新消息,m iageva static int witch=1或=0来更新消息。。当他们发送新消息时,它会将其更新为1。代码很奇怪,有时我会收到两次所有消息,有时他们不会发送 我只是想知道是否还有其他方法可以做到这一点,你们中的任何人都知道,比如教程或建议 我的代码:

我在按钮上插入消息的代码

using (SqlDatabaseClient client = SqlDatabaseManager.GetClient())
{
    int id = int.Parse(client.ExecuteScalar("SELECT COUNT(*) FROM program_messages").ToString());
    client.SetParameter("id", id + 1);
    client.SetParameter("sender", mUsername);
    client.SetParameter("message", textBox1.Text);
    client.SetParameter("timesent", DateTime.Now);
    client.ExecuteNonQuery("INSERT INTO program_messages (`id`,`sender`,`message`,`timesent`) VALUES (@id,@sender,@message,@timesent)");
}
updateneeded = 1;
刷新消息的我的代码

using (SqlDatabaseClient client6 = SqlDatabaseManager.GetClient())
{
    int id = int.Parse(client6.ExecuteScalar("SELECT COUNT(*) FROM program_messages").ToString());
    int finalcount = listBox2.Items.Count;
    foreach (DataRow row2 in client6.ExecuteQueryTable("SELECT * FROM program_messages").Rows)
    {
        if (updateneeded > 0)
        {
            if (!listBox2.Items.Contains((string)row2["sender"] + ": " + (string)row2["message"]))
            listBox2.Items.Add((string)row2["sender"] + ": " + (string)row2["message"]);
        }
    }
    updateneeded = 0;
}

这可能是罪魁祸首:

using (SqlDatabaseClient client = SqlDatabaseManager.GetClient())
{
    int id = int.Parse(client.ExecuteScalar("SELECT COUNT(*) FROM program_messages").ToString());
    client.SetParameter("id", id + 1);
    // ...
    client.ExecuteNonQuery("INSERT INTO program_messages (`id`,`sender`,`message`,`timesent`) VALUES (@id,@sender,@message,@timesent)");
}
updateneeded = 1;
您应该将该id列设置为标识,并让SQL来处理它。这样,您就可以删除第一条SELECT语句并执行单个查询。 此外,您还应该通过GETDATE使您的timesent和自动生成的值保持一致,以便在所有客户机上保持一致

您的代码将变成:

using (SqlDatabaseClient client = SqlDatabaseManager.GetClient())
{
    client.SetParameter("sender", mUsername);
    client.SetParameter("message", textBox1.Text);
    client.ExecuteNonQuery("INSERT INTO program_messages ('sender','message','timesent') VALUES (@sender,@message,GETDATE())");
}
updateneeded = 1;

作为一个教程,我建议你看一些视频

您将回顾以下几点:

TCP/IP聊天

基本客户机/服务器

winforms IP地址

周转基金

插座


这对我帮助很大

其实不久前我自己也做过。P2P是一条发展之路。我不知道你为什么想把聊天日志保存到数据库中,让任何人都可以查看。但这里看看这个


1.我不会使用计时器,而是使用事件2。您的方法允许使用SQLinjection@Robert你会推荐他参加什么活动?你可以使用SqlDependency,但是,我认为轮询是正确的方法。我知道robert来自哪里,我认为他的意思是刷新按钮上的消息,以便它知道何时有新消息显示,witch比timers更好。1。我不会用SQL聊天,而是通过TCP/UDP。2.您不应该使用计算机上的本地日期时间,由于客户端之间可能会有所不同,因此最好使用服务器日期时间。您需要一个自动递增列,而不是这样做您自己记录消息可能会有很多用处,因为您希望查看聊天记录,并且您不是参与者之一,但根据我的经验,大多数人在谈论关键点时,政治正确性较低。如果他们在不知情的情况下被记录下来,那就可能弊大于利。IMHO。我想到了一个经典的电话录音是为了质量保证,所以对于一个非常有意义的企业来说,录制聊天记录是很有意义的。这只是为了你的电脑还是多个用户?多个,一个1人的聊天程序是没有用的;