2017-02-13 28 views
0

我的套接字侦听端口,但是只对第一次发送消息作出反应,而不会发送更多消息。 有什么问题?任何建议如何解决它?因为我已经不知道该怎么做。也许我听港口的方式不合适?套接字侦听器只响应一次

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) 

当你的代码永远不会离开while循环 - 它从来没有迂回到接受下一个连接。