2013-10-03 28 views
1

问题:Java Socket技术编程

我写了一个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