2013-10-03 1 views
1

Проблема:Java Оправа Programing

Я написал один Java сокет сервера который отправить ответ, когда я отправить первое сообщение от клиента к нему. Но я хочу отправить еще одно сообщение, основанное на первом ответе. После первого ответа я не получаю никакого другого ответа?

Вот код сервера:

public class SendSmsServerSocket { 

    private final static CxpsLogger logger = CxpsLogger.getLogger(SendSmsServerSocket.class); 

    SendSmsServerSocket(){ 
     try { 
      new SeverSocketForSms(new ServerSocket(4330)); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

    } 
} 


private static class SeverSocketForSms extends Thread { 

    private Socket socket; 
    private ServerSocket serversocket; 
    private volatile static boolean running = true; 

    public SeverSocketForSms(ServerSocket ssocket) throws IOException { 
     this.serversocket = ssocket; 
     start(); 
    } 

    public void run() { 
     try{ 
     while(running) { 
      this.socket = serversocket.accept(); 
      InputStreamReader ir = new InputStreamReader(socket.getInputStream()); 
      BufferedReader br = new BufferedReader(ir); 
      String msg = br.readLine(); 

      PrintStream ps = new PrintStream(socket.getOutputStream()); 
      ps.println("inside SeverSocketForSms: msg received is : "+msg); 
     } 


     } 
     catch(Exception e){ 
     e.printStackTrace(); 
     } 
     catch(Throwable t) { 
     System.out.println("Caught " + t + "xmlServerThread - closing thread"); 
     } 
    } 

    public static void shutdown() { 
     System.out.println("Stopping socket connection and thread"); 
     try{ 
      socket.close(); 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
     running = false; 
    } 



    public static void main (String [] args){ 
     try { 
      System.out.println("Starting sms server ----- Please press Enter Key to stop the server after receiving one message"); 
      SendSmsServerSocket s=new SendSmsServerSocket(); 

      new Scanner(System.in).nextLine(); 
      SeverSocketForSms.shutdown(); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 



    } 
} 

ответ

1

После того, как у вас есть входящее соединение, вы должны delgate ответственность за обработку, что входящее подключение к другому Thread, в противном случае вы будете блокировать ваш «не принимать» поток до текущее соединение закрывается ...

while (running) { 
    this.socket = serversocket.accept(); 
    Thread thread = new Thread(new Handler(socket)); 
    thread.start(); 
} 

И в Handler

public class Handler implements Runnable { 
    private Socket socket; 
    public Handler(Socket socket){ 
     this.socket = socket; 
    } 

    public void run() { 
     // You may need to add a repeat and exit clause here... 
     InputStreamReader ir = new InputStreamReader(socket.getInputStream()); 
     BufferedReader br = new BufferedReader(ir); 
     String msg = br.readLine(); 

     PrintStream ps = new PrintStream(socket.getOutputStream()); 
     ps.println("inside SeverSocketForSms: msg received is : " + msg); 
    } 
} 
+0

Лучше использовать пул потоков вместо создания потока для каждого запроса. – xfeep

+0

@xfeep Это верно – MadProgrammer