进行聊天应用程序时模块“ SimpleTCP”存在问题

时间:2019-03-24 15:03:36

标签: c# .net web chat

所以我想用C#制作一个聊天应用程序,我观看了有关它的视频(https://www.youtube.com/watch?v=ve2LX1tOwIM),现在我已经完全复制了代码,但是当我运行服务器时,将客户端连接到服务器并发送来自客户端的消息发生了什么事,它无限地将消息发送到客户端和服务器。我不确定为什么这样做,因为代码与我观看的视频中的代码完全一样。您可以在我的repository中看到它。

如果您想查看代码: 客户:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SimpleTCP;

namespace Client
{
    public partial class ClientForm : Form
    {
        SimpleTcpClient client;

        public ClientForm()
        {
            InitializeComponent();
        }

        private void ClientForm_Load(object sender, EventArgs e)
        {
            client = new SimpleTcpClient();
            client.StringEncoder = Encoding.UTF8;
            client.DataReceived += Client_DataReceived;
        }

        private void Client_DataReceived(Object sender, SimpleTCP.Message e)
        {
            txtStatus.Invoke((MethodInvoker)delegate ()
            {
                txtStatus.Text += e.MessageString;
                e.ReplyLine(String.Format("You: {0}", e.MessageString));
            });
        }

        private void SendMessageInput_Click(object sender, EventArgs e)
        {
            client.WriteLine(MessageInput.Text);
        }

        private void StartInput_Click(object sender, EventArgs e)
        {
            StartInput.Enabled = false;
            client.Connect(HostInput.Text, Convert.ToInt32(PortInput.Text));
        }
    }
}

这就是服务器:

using System;
using System.Net;
using System.Text;
using System.Windows.Forms;
using SimpleTCP;

namespace HyperChat
{
    public partial class ServerForm : Form
    {
        SimpleTcpServer server;

        public ServerForm()
        {
            InitializeComponent();
        }

        private void ServerForm_Load(object sender, EventArgs e)
        {
            server = new SimpleTcpServer();
            server.Delimiter = 0x13;
            server.StringEncoder = Encoding.UTF8;
            server.DataReceived += Server_DataReceived;
        }

        private void Server_DataReceived(object sender, SimpleTCP.Message e)
        {
            txtStatus.Invoke((MethodInvoker)delegate ()
            {
                txtStatus.Text += e.MessageString;
                e.ReplyLine(String.Format("You: {0}", e.MessageString));
            });
        }

        private void StartButton_Click(object sender, EventArgs e)
        {
            txtStatus.Text += "Server Started...";
            IPAddress ip = IPAddress.Parse(hostInput.Text);
            server.Start(ip, Convert.ToInt32(portInput.Text));
            StartButton.Enabled = false;
        }

        private void StopButton_Click(object sender, EventArgs e)
        {
            if (server.IsStarted)
            {
                server.Stop();
            }
        }
    }
}

我非常感谢获得帮助,我尝试弄乱我的代码,但是它并没有真正起作用,我想在视频中提到他们说您需要连接才能使用以下方法获得要连接的IP:

System.Net.IPAddress ip = new System.Net.IPAddress(long.Parse(txtHost.Text))

但这会带来错误,您真正需要做的是:

System.Net.IPAddress ip = System.Net.IPAddress.Parse(hostInput.Text);

我希望发生的事情是服务器发送邮件,就像它应该发送的一样,但是由于某种原因它没有发送。 我真的很感谢获得帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

问题是客户端和服务器上都具有e.ReplyLine…,将其从客户端中删除,代码应该可以工作。

正在发生的事情是,客户端发送了一条消息,服务器随后接收并发送了答复,客户端接收了答复,如果您的代码向服务器发送了答复,则结果是服务器接收了回复并发送回复,依此类推...

答案 1 :(得分:0)

@Chris Taylor解释了解决方案,正如他所说,我所做的是客户端向服务器发送了一条消息,当服务器收到一条消息时,他用一条消息进行了回复,客户端对造成无限循环的回复。解决此问题的方法是删除客户端上答复服务器的行并防止循环。 非常感谢您的帮助,克里斯。