Search code examples
c#tcpclienttcplistener

How can I make a server print a notification as soon as a client connects to it?


Take a look at the following two programs:

//Server

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace MyServerProgram
{
    class Program
    {
        static void Main(string[] args)
        {            
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            int port = 2000;
            TcpListener listener = new TcpListener(ip, port);
            listener.Start();

            TcpClient client = listener.AcceptTcpClient();

            NetworkStream netStream = client.GetStream();

            BinaryReader br = new BinaryReader(netStream);

            try
            {
                while (client.Client.Connected)
                {
                    string str = br.ReadString();

                    Console.WriteLine(str);
                }
            }
            catch
            {
                br.Close();
                netStream.Close();
                client.Close();
                listener.Stop();
            }
        }
    }
}

//Client

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace MyClientProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 2000;
            TcpClient client = new TcpClient("localhost", port);

            NetworkStream netStream = client.GetStream();

            BinaryWriter br = new BinaryWriter(netStream);

            try
            {
                int i=1;
                while (client.Client.Connected)
                {
                    br.Write(i.ToString());
                    br.Flush();
                    i++;

                    int milliseconds = 2000;
                    System.Threading.Thread.Sleep(milliseconds);
                }
            }
            catch
            {
                br.Close();
                netStream.Close();
                client.Close();
            }
        }
    }
}

These programs are working fine.

Suppose, at this point of this program, I need the server to print a message on the screen as soon as a client gets connected to it, and, also when the client is disconnected.

How can I do that?


Solution

  • AcceptTcpClient blocks execution and starts waiting for connection. So right after it you can write message that client connected. Also you could write connected client address. Just for information, but sometimes it could be helpful.

    TcpClient client = listener.AcceptTcpClient();
    ShowMessage("Connected " + ((IPEndPoint)client.Client.RemoteEndPoint).Address);
    

    For detect client disconnect you could catch exceptions. Change your catch like this:

    catch (Exception ex) {
        var inner = ex.InnerException as SocketException;
        if (inner != null && inner.SocketErrorCode == SocketError.ConnectionReset)
            ShowMessage("Disconnected");
        else
            ShowMessage(ex.Message);
    ...