Как постоянно получать команды с сервера
Сразу скажу, что сокеты только начал изучать и вообще что связано с этим. Не исключаю, что здесь написан глупый код, буду рад поправкам.
Задача такая: необходимо удаленно отправлять команды на компьютер. Есть 3 файла - Server,Admin(с него мы отправляем команду на сервер), Client(принимает команду с сервера).
Server:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Server
{
class Program
{
static int port = 8005; // порт для приема входящих запросов
static void Main(string[] args)
{
// получаем адреса для запуска сокета
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
// создаем сокет
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// связываем сокет с локальной точкой, по которой будем принимать данные
listenSocket.Bind(ipPoint);
// начинаем прослушивание
listenSocket.Listen(10);
Console.WriteLine("Сервер запущен. Ожидание подключений...");
while (true)
{
Socket handler = listenSocket.Accept();
// получаем сообщение
StringBuilder builder = new StringBuilder();
int bytes = 0; // количество полученных байтов
byte[] data = new byte[256]; // буфер для получаемых данных
do
{
bytes = handler.Receive(data);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (handler.Available > 0);
Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + builder.ToString());
// отправляем ответ
string message = "ваше сообщение доставлено";
data = Encoding.Unicode.GetBytes(message);
handler.Send(data); // Необходимо отправить всем клиентам, которые прослушивают сервер
// закрываем сокет
// handler.Shutdown(SocketShutdown.Both);
//handler.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Admin:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
namespace AdminServer
{
class Program
{
// адрес и порт сервера, к которому будем подключаться
static int port = 8005; // порт сервера
static string address = "127.0.0.1"; // адрес сервера
static void Main(string[] args)
{
try
{
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// подключаемся к удаленному хосту
socket.Connect(ipPoint);
Console.Write("Введите сообщение:");
string message = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(message);
socket.Send(data);
// получаем ответ
data = new byte[256]; // буфер для ответа
StringBuilder builder = new StringBuilder();
int bytes = 0; // количество полученных байт
do
{
bytes = socket.Receive(data, data.Length, 0);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (socket.Available > 0);
Console.WriteLine("ответ сервера: " + builder.ToString());
// закрываем сокет
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//Console.Read();
}
}
}
Client:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
namespace ClientServer
{
class Program
{
static void disp() // запускаем диспетчер задач
{
Process.Start("taskmgr.exe");
}
// адрес и порт сервера, к которому будем подключаться
static int port = 8005; // порт сервера
static string address = "127.0.0.1"; // адрес сервера
static void Main(string[] args)
{
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(address, port);
NetworkStream Stream = tcpClient.GetStream();
while (true)
{
//Читаем сообщение с сервера!
StringBuilder builder = new StringBuilder();
byte[] data = new byte[256];
int bytes = Stream.Read(data, 0, data.Length); // получаем количество считанных байтов
string message = Encoding.UTF8.GetString(data, 0, bytes);
do
{
bytes = Stream.Read(data, 0, data.Length);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (Stream.DataAvailable);
if (builder.ToString() == "disp")
{
disp();
}
Console.WriteLine(message);
}
}
}
}
То как работают Admin и Server у меня вопросов нету, но Client не принимает команды.
Ответы (1 шт):
Если я не ошибаюсь, ваш listenSocket.Accept(); работает в режиме строгой очереди.
socket.Available > 0 - может раньше закрыть соединение чем нужно, если допустим в буфере временно не будет данных.
Ваш Client, только читает данные, но не ожидает запрос входящих соединений, а ваш Server так-же начинает приём данных.
Советую вам остановиться и продумать условия переходов состояний от пункта к пункту внутри каждого приложения, т.к. то, что вы описали - оно не будет работать должным образом.
Как минимум - вынесите в отдельные функции каждый этап работы каждой вашей программы.