Есть 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);
}
}
}
Усли клиент не имеет "прямого соединения" с сервером и только сервер решает, когда отправить сообщение (и у Вас есть подключение к интернету) используйте Push уведомления. Не знаю, как с WinForms/WPF, но UWP для этого подходит. Как реализовать - бурите любой сервис, предоставляющий данную услугу.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Сижу делаю приложуньку, которая работает с базой данныхИ случайно удалил модель ADO