Проблема с модулем «SimpleTCP» при создании приложения для чата

#c# #.net #web #chat

#c# #.net #веб #Чат

Вопрос:

Итак, я хотел сделать приложение для чата на C #, я посмотрел видео об этом (https://www.youtube.com/watch?v=ve2LX1tOwIM ) на данный момент я полностью скопировал код, но когда я запускаю сервер, подключаю клиента к серверу и отправляю сообщение от клиента, происходит то, что он бесконечно отправляет сообщение как клиенту, так и серверу. Я не уверен, почему это происходит, поскольку код точно такой, как показано в видео, которое я смотрел. Вы можете увидеть это в моем репозитории.

На случай, если вы хотите увидеть код: Client:

 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);
  

Я ожидаю, что сервер отправит сообщение так, как должно, но по какой-то причине этого не происходит.
Я был бы очень признателен за помощь в этом. Спасибо.

Ответ №1:

Проблема в том, что у вас есть e.ReplyLine… как в клиенте, так и на сервере, удалите это из клиента, и ваш код должен работать.

Происходит то, что клиент отправляет сообщение, которое затем получает сервер и отправляет ответ на него, клиент получает ответ и в случае вашего кода отправляет ответ на сервер, в результате сервер получает ответ и отправляет ответ на это и так далее…

Ответ №2:

Итак, решение этого было объяснено @Chris Taylor, и, как он говорил, я сделал то, что клиент отправил серверу сообщение, когда сервер получает сообщение, он отвечает сообщением, клиент отвечает на ответ, который создает бесконечный цикл. Способ решить это состоял в том, чтобы удалить строку на клиенте, которая отвечает серверу, и предотвратить цикл. Я действительно ценю помощь, спасибо Крису.