2016-10-06 3 views
-2

В моем основном потоке у меня есть цикл while (listen), который вызывает accept() на моем объекте ServerSocket, затем запускает новый клиентский поток и добавляет его в коллекцию, когда новый клиент принят. Однако вызов accept() в циклах while (прослушивания) и я пытаюсь закрыть соединение. пожалуйста, найдите мой примерный пример кода, есть ли способ создать службу-обертку, чтобы закрыть соединение сокета для следующей серверной программы.Многопоточная розетка - Невозможно закрыть розетку

public static final void serverSocket(IData pipeline) throws ServiceException { 
    int clientNumber = 0; 
    ServerSocket listener = null; 
    int port =0; 
    Properties socketProperties = new Properties(); 

    try 
    { 
     listener = new ServerSocket(port); 
     System.out.println(listener.getLocalSocketAddress());   
    } 

    catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 

     while(true){ 
      new Connections(listener.accept(), clientNumber++).start(); 

     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 

    } 
    finally{ 

     try { 
      listener.close(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

private static class Connections extends Thread { 

    private Socket socket; 
    private int clientNumber; 


    public Connections(Socket socket, int clientNumber) { 
     this.socket = socket; 
     this.clientNumber = clientNumber; 
     log("New connection with client# " + clientNumber + " at " + socket); 
    } 

    public void run() 
    { 
     try { 

      // Send a welcome message to the client. 

      while (true) 

      { 

       // my program 
      } 
     catch (IOException e) { 

      //exception 
     } 

     finally { 

      try { 
       socket.close(); 

      } 
       catch (IOException e) { 
     log.error("Couldn't close a socket, what's going on?"); 
      } 
      log("Connection with client# " + clientNumber + " closed"); 

     } 
    } 

Любые предложения были бы высоко оценены.

+0

Соединение должно быть закрыто, когда объект 'Connections' либо заканчивает то, что он должен делать, либо встречает EOS или фатальное' IOException' в используемом сокете. Примеры изобилуют. Неясно, в чем проблема. – EJP

ответ

0

Вы недостаточно описали обстоятельства, которые диктуют, когда вы хотите закрыть.

В любом случае ваш объект serverSocket может стать статическим полем, доступным для некоторых других потоков, и что другой поток может решить, когда его закрыть.

+0

Я хотел бы создать отдельный код java для остановки порта сокета, как мы можем его достичь? – Dil

+1

@Dil Придумай. Если вы хотите остановить прослушивающий сокет, просто закройте его. Но ваш вопрос касается закрытия соединений, что не то же самое. – EJP

+0

Получил, спасибо :), извините за смущение. На самом деле, теперь я столкнулся с другой проблемой. Например, – Dil

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