Как я могу заставить сервер распечатать уведомление, как только клиент подключится к нему? - PullRequest
2 голосов
/ 27 апреля 2019

Взгляните на следующие две программы:

//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();
            }
        }
    }
}

Эти программы работают нормально.

Предположим, на данном этапе этой программы мне нужен сервер для печати сообщения.на экране, как только клиент подключается к нему, а также, когда клиент отключен.

Как я могу это сделать?

1 Ответ

2 голосов
/ 28 апреля 2019

AcceptTcpClient блокирует выполнение и начинает ждать подключения. Поэтому сразу после него вы можете написать сообщение, что клиент connected. Также вы можете написать адрес подключенного клиента. Просто для информации, но иногда это может быть полезно.

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

Для обнаружения отключения клиента вы можете перехватить исключения. Измените catch так:

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