Отправка сообщения от c# сервера

258
05 ноября 2017, 15:44

Есть C# проект с GUI. Есть задача реализовать отправку сообщения по нажатию кнопки с сервера клиенту.

Вообще возможно такое? Если да, то подскажите пожалуйста как? С отправкой сообщения в ответ на запрос клиента проблем нет. А тут не представляю уже как это делать.

P.S. предполагается взаимодействие только с 1 клиентом.

namespace ServerProg
{
class Server
{
    Socket s_server;
    IPEndPoint ip;
    byte[] data;
    public Server(string sIp, int nPort)
    {         
        ip = new IPEndPoint(IPAddress.Parse(sIp), nPort);
        data = new byte[1024];
    }
    public void SetClientData(IPEndPoint client_data )
    {
        c_client = new Client(client_data);
    }
    public void Send(string str)
    {
           // вызывается при нажатии на кнопку
           // отправка сообщения от сервера клиенту         
    }
    private void SendCallback(IAsyncResult ar)
    {
        try
        {
            Socket handler = (Socket)ar.AsyncState;
            int bytesSent = handler.EndSend(ar);
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
        }
    }
    public void Start()
    {
        s_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        s_server.Bind(ip);
        s_server.Listen(5);
        s_server.BeginAccept(new AsyncCallback(AcceptConn), s_server);
    }
    void AcceptConn(IAsyncResult iar) {
        Socket oldserver = (Socket)iar.AsyncState;
        Socket client = oldserver.EndAccept(iar);
        Debug.WriteLine("Connected to: {0}", client.RemoteEndPoint);
        string stringData = "Connected";
        byte[] message1 = Encoding.ASCII.GetBytes(stringData);
        client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client);            
    }
    public void ReceiveCallback(IAsyncResult iar)
    {
        Socket client = (Socket)iar.AsyncState;
        int recv = client.EndReceive(iar);
        if (recv == 0)
        {
            client.Close();
            s_server.BeginAccept(new AsyncCallback(AcceptConn), s_server);
            return;
        }
        string receivedData = Encoding.ASCII.GetString(data, 0, recv);
        byte[] message2 = Encoding.ASCII.GetBytes(receivedData);
        client.BeginSend(message2, 0, message2.Length, SocketFlags.None, new AsyncCallback(SendData), client);
    }
    void SendData(IAsyncResult iar)
    {
        Socket client = (Socket)iar.AsyncState;
        client.BeginReceive(data, 0, 1024, SocketFlags.None, new AsyncCallback(ReceiveCallback), client);
    }
}

}

Answer 1

Усли клиент не имеет "прямого соединения" с сервером и только сервер решает, когда отправить сообщение (и у Вас есть подключение к интернету) используйте Push уведомления. Не знаю, как с WinForms/WPF, но UWP для этого подходит. Как реализовать - бурите любой сервис, предоставляющий данную услугу.

READ ALSO
Замена данных в JSON

Замена данных в JSON

Наконец-то разобрался с wwwnewtonsoft

205
C# цифры после запятой

C# цифры после запятой

Такой вопросДопустим у нас есть значение 25

403
DES возвращает 128 битов вместо 64

DES возвращает 128 битов вместо 64

Взял код для работы с DES с сайта MSDN:

341
Entity Framework. System.Data.Entity.Infrastructure.DbUpdateException [требует правки]

Entity Framework. System.Data.Entity.Infrastructure.DbUpdateException [требует правки]

Сижу делаю приложуньку, которая работает с базой данныхИ случайно удалил модель ADO

268