0
Мой сокет прослушивает порт, но реагирует на сообщение только в первый раз и никогда больше. Что случилось? Любые предложения по его устранению? Потому что я уже не знаю, что делать. Может быть, способ, которым я слушаю порт, не подходит?Socket прослушиватель реагирует только один раз
public partial class Listener
{
private void InitListener()
{
Logger.InitializeLogger();
var listenSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
var ipHostInfo = Dns.Resolve(Dns.GetHostName());
var ipAddress = ipHostInfo.AddressList[0];
var endPoint = new IPEndPoint(ipAddress, Settings.Default.Port);
listenSocket.Bind(endPoint);
listenSocket.Listen(Settings.Default.listenerMaxConnection);
Logger.EventLogItem.WriteEntry(
$"Listen to {ipAddress}:{Settings.Default.Port}");
Logger.EventLogItem.WriteEntry("Connection Recieved");
Thread thread = new Thread(o => Listen(listenSocket));
thread.Start();
}
public void Listen(Socket socket)
{
var directory = @"C:\\Users\\*****\\Desktop\\bat files";
var handler = socket.Accept();
while (true)
{
try
{
while (handler.Connected)
{
byte[] x = new byte[100000];
handler.Receive(x);
var command = new string(Encoding.UTF8.GetChars(x.Where(t => t != 0).ToArray()));
if (string.IsNullOrEmpty(command))
{
Logger.EventLogItem.WriteEntry("Warning: Empty string");
break;
}
Logger.EventLogItem.WriteEntry(command);
Console.WriteLine(command);
switch (command)
{
case "run":
var myFiles = Directory.GetFiles(directory, "*.bat");
foreach (var bat in myFiles)
{
Process.Start(bat);
}
Logger.EventLogItem.WriteEntry("By command: " + command +
" was executed an appropriate .bat file.");
break;
case "getThreads":
Logger.EventLogItem.WriteEntry("By command: " + command +
" was executed an appropriate .bat file.");
break;
case "stop":
Logger.EventLogItem.WriteEntry("By command: " + command +
" was executed an appropriate .bat file.");
break;
case "start":
Logger.EventLogItem.WriteEntry("By command: " + command +
" was executed an appropriate .bat file.");
break;
case "close":
Logger.EventLogItem.WriteEntry("By command: " + command +
" was executed an appropriate .bat file.");
break;
}
}
}
catch (Exception ex)
{
Logger.EventLogItem.WriteEntry(
$"Exception happened in Listener: {ex.Message} - {ex.StackTrace}");
}
}
}
}
public partial class Listener
{
public static Listener Handler { get; } = new Listener();
public Listener()
{
var thread = new Thread(InitListener);
thread.Start();
}
}
А вот мой главный
Listener listener = Listener.Handler;
Вы принимали вне цикла, поэтому он никогда не возвращается, чтобы попробовать для следующих подключений. – BugFinder
Как ваш клиент подключается к серверу? Если он отправляет данные и отключает, вам нужно будет переместить ['Socket.Accept'] (https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.accept (v = vs. 110) .aspx) в петлю. См. [Пример в msdn] (https://msdn.microsoft.com/en-us/library/6y0e13d3 (v = vs.110) .aspx) – slawekwin
@BugFinder спасибо! Я не видел, чтобы каждый раз – Ekaterina