问一个socket server的问题,我现在是可以多条client连接Server,,一般是先连接,然后发送数据,,但是我现在出现的问题是当一个client连接Server的时候只连接上但不发送数据,这时候其它的client也进不来了,,想问下有没有好的思路啊,,

解决方案 »

  1.   

    ServerSocket 监听的线程,除了 accept() 不要做别的事,给每个连入的 Socket 单独分配一个线程。为了共享状态,使用相同的逻辑对待所有连入的 Socket,可以用 inner class,比如下面这样的设计:
    import java.io.IOException;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;public abstract class SocketServer implements Runnable {
      
      public static void main(String[] args) throws Exception {
        
        SocketServer server = new SocketServer(4321) {      @Override
          protected void serve(Socket socket) {
            
            try {
              
              PrintStream ps = new PrintStream(socket.getOutputStream());
              ps.println("Hello!");
              ps.flush();
              ps.close();
              socket.close();
            }
            catch(IOException ex) {
              
              ex.printStackTrace();
            }
          }
        };
        
        server.start();
        
        // ...
      }
      
      private final int port;
      private volatile boolean runFlag;
      private ExecutorService executor;
      public SocketServer(int port) {
        
        this.port = port;
      }
      
      @Override
      public void run() {
        
        ServerSocket ss = null;
        try {
          
          ss = new ServerSocket(port);
          runFlag = true;
          while( runFlag ) {
            
            Socket socket = ss.accept();
            if( runFlag )
              getExecutor().submit(new Connection(socket));
          }
        }
        catch(IOException ex) {
          
          throw new RuntimeException(ex);
        }
        finally {
          
          try {
            
            if( ss != null )
              ss.close();
          }
          catch(Exception e) {
            
            // log exception
          }
        }
      }
      
      public void start() {
        
        getExecutor().submit(this);
      }
      
      public void stop() {
        
        runFlag = false;
        
        try {
          
          new Socket("127.0.0.1", port).close();
        }
        catch(IOException ex) {
          
          // not important
        }
      }
      
      protected abstract void serve(Socket socket);
      
      protected ExecutorService getExecutor() {
        
        if( executor == null )
          executor = Executors.newCachedThreadPool();
        return executor;
      }
      
      private class Connection implements Runnable {
        
        private final Socket socket;
        private Connection(Socket socket) {
          
          this.socket = socket;
        }    @Override
        public void run() {
          
          serve(socket);
        }
      }
    }
      

  2.   

    先去了解下阻塞式IO和异步式IO(NIO)