2017-02-13 2 views
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; 
+1

Вы принимали вне цикла, поэтому он никогда не возвращается, чтобы попробовать для следующих подключений. – BugFinder

+0

Как ваш клиент подключается к серверу? Если он отправляет данные и отключает, вам нужно будет переместить ['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

+0

@BugFinder спасибо! Я не видел, чтобы каждый раз – Ekaterina

ответ

2

Ваша проблема заключается здесь:

var handler = socket.Accept(); 
while (true) 
{ 
    try 
    { 
     while (handler.Connected) 

Как ваш код никогда не покидает время цикла - он никогда не объезжает, чтобы принять следующую связь.

Смежные вопросы