how to send a message between clients

Yairk_kaufmann 6 Reputation points
2021-03-18T12:45:14.017+00:00

I did a project of a server that can choose from a list with which client to talk to and there the client can only talk to the server, and I want to make that the client will also have the option to choose from a list if which client to talk to,

This is the server code:

using SimpleTcp;
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;

namespace TCPServer
{
    public partial class Form1 : Form
    {
        int frindNum;
        public Form1()
        {
            InitializeComponent();
        }

    public SimpleTcpServer server;

    private void btnStart_Click(object sender, EventArgs e)
    {
        server.Start();
        btnSend.Enabled = false;
        txtInfo.Text += $"starting...{Environment.NewLine}";
        btnStart.Enabled = false;
        btnSend.Enabled = true;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        btnSend.Enabled = false;
        server = new SimpleTcpServer(txtIP.Text);
        server.Events.ClientConnected += Events_ClientConnected;
        server.Events.ClientDisconnected += Events_ClientDisconnected;
        server.Events.DataReceived += Events_DataReceived;
    }

    private void Events_DataReceived(object sender, DataReceivedEventArgs e)
    {
        this.Invoke((MethodInvoker)delegate
        {
            txtInfo.Text += $"{"frind" + frindNum}: {Encoding.UTF8.GetString(e.Data)} {Environment.NewLine}";
        });
    }

    private void Events_ClientDisconnected(object sender, ClientDisconnectedEventArgs e)
    {
        this.Invoke((MethodInvoker)delegate
        {
            server.Send(lstClientIP.SelectedItem.ToString(), txtMessage.Text);
            txtInfo.Text += $"{"frind" + frindNum} disconnected.{Environment.NewLine}";
            lstClientIP.Items.Remove("frind" + frindNum);
            frindNum -= 1;
        });

    }

    private void Events_ClientConnected(object sender, ClientConnectedEventArgs e)
    {
        this.Invoke((MethodInvoker) delegate 
        {
            frindNum += 1;
            txtInfo.Text += $"{"frind" + frindNum} connected.{Environment.NewLine}";
            lstClientIP.Items.Add("frind" + frindNum);
        });

    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        if (server.IsListening)
        {
            if(!string.IsNullOrEmpty(txtMessage.Text) && lstClientIP.SelectedItem != null)
            {

                server.Send(lstClientIP.SelectedItem.ToString(), txtMessage.Text);

                txtInfo.Text += $"server: {txtMessage.Text}{Environment.NewLine}";
            }
        }
    }

    private void lstClientIP_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
}

}

This is the client code:

using SimpleTcp;
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;

namespace TCP_Client
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

    SimpleTcpClient client;


    private void btnConnect_Click(object sender, EventArgs e)
    {
        try
        {
            client.Connect();
            btnSend.Enabled = true;
            btnConnect.Enabled = false;
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message, "messege", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        client = new(txtIP.Text);
        client.Events.Connected += Events_ClientConnected;
        client.Events.DataReceived += Events_DataReceived;
        client.Events.Disconnected += Events_ClientDisconnected;
        btnSend.Enabled = false;

    }

    private void Events_ClientDisconnected(object sender, ClientDisconnectedEventArgs e)
    {
        this.Invoke((MethodInvoker)delegate
        {
            txtInfo.Text += $"server disconected.{Environment.NewLine}";
        });
    }

    private void Events_DataReceived(object sender, DataReceivedEventArgs e)
    {
        this.Invoke((MethodInvoker)delegate
        {
            txtInfo.Text += $"server: {Encoding.UTF8.GetString(e.Data)} {Environment.NewLine}";
        });

    }

    private void Events_ClientConnected(object sender, ClientConnectedEventArgs e)
    {
        this.Invoke((MethodInvoker)delegate
        {
            txtInfo.Text += $"server conected.{Environment.NewLine}";
        });

    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        if (client.IsConnected)
        {
            if (!string.IsNullOrEmpty(txtMessage.Text))
            {

                client.Send(txtMessage.Text);
                txtInfo.Text += $"me: {txtMessage.Text}{Environment.NewLine}";
                txtMessage.Text = string.Empty;
            }
        }
    }

    private void lstClientIP_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
}

}

Developer technologies C#
{count} votes

1 answer

Sort by: Most helpful
  1. Daniel Zhang-MSFT 9,651 Reputation points
    2021-03-19T07:35:10.663+00:00

    Hi @Yairk_kaufmann ,
    Maybe you can try the BradleyDotNET's method that holding the incoming client objects in memory.
    Best Regards,
    Daniel Zhang


    If the response is helpful, please click "Accept Answer" and upvote it.

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.

    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.