2011-07-19 11 views
3

こんにちは私はJava:複数の接続を持つハンドリングソケット?

public class Tcpfileserver extends Thread 
{  
    private ServerSocket serverSocket;  


    public static void main(String[] args) 
    {   
     Tcpfileserver obj=new Tcpfileserver(); 
     obj.start();   
    } 

public void run() 
    { 
serverSocket = new ServerSocket(3000); 
    while(true) 
        { 
         Socket socket = serverSocket.accept(); // accept connection 

         TcpThread t = new TcpThread(socket); // make a thread of it 

         //System.out.println("Remote IP:"+socket.getInetAddress()); 

         //System.out.println("Remote Port:"+socket.getPort()); 

         t.start();   
        }} 

...接続するための複数のクライアントのために、サーバ側で次のコードを使用していますが、複数のクライアントがそれらのいくつかのタイムアウト自分のサーバーに接続するときに、なぜ受け入れるために私の側からの遅延がありますすぐに接続?

答えて

4

はここでは問題がなくても10個の接続点で最大受け入れるべき

serverSocket = new ServerSocket(3000,10); 

としてクライアントの最大数を指定してみてください。 さらに、netstat -aを使用して統計情報を確認すると、1つのクライアントに接続してもポート3000が引き続きリッスンしていて、既存のクライアントに3001(またはそれ以上)/ 2999(またはそれ以下)ポートを割り当てていることを確認できます。

+0

は、接続の数ではありません1つのクライアントだけがあるtimout..if !!時々、第二のクライアントにも行く – Harinder

+0

を介して接続されていますこれは、あなたの視点から複数の接続をハンドリングする正しい方法ですか? – Harinder

+0

はい、私は思います。このコマンド "netstat -a"の出力をチェックしましたか?それはあなたの3000ポートが常にTIME_WAITと言うローカルポートでリスニング状態にあるべきであり、確立された接続がESTABLISHED状態にあるようにすべきです。 – peeyush

0

フレームワークの使用を検討していますか? これを試してみる:Apache MINA

サンプルコード:問題@bt

public abstract class DefaultServerHandler extends IoHandlerAdapter { 
    private SocketAcceptor acceptor; 
    private String socketAddress; 
    private int socketPort; 

    @Override 
    public void exceptionCaught(IoSession session, Throwable t) 
     throws Exception { 
      log.error(Trace.getStackTrace(t)); 
      session.close(); 
    } 

    @Override 
    public void messageReceived(IoSession session, Object msg) throws Exception { 
      //code to process received messages 
    } 

    @Override 
    public void sessionCreated(IoSession session) throws Exception { 
      log.info("Session created by: " + session.getRemoteAddress()); 
      if (session.getTransportType() == TransportType.SOCKET) { 
       ((SocketSessionConfig) session.getConfig()) 
       .setReceiveBufferSize(2048); 
      } 
      session.setIdleTime(IdleStatus.BOTH_IDLE, 10); 
    } 

    public void bind() { 
      log.info("bind " + socketPort); 
      ByteBuffer.setUseDirectBuffers(false); 
      ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); 

      acceptor = new SocketAcceptor(); 

      ProtocolCodecFilter codec = new ProtocolCodecFilter(
      new TextLineCodecFactory(Charset.forName("UTF-8"))); 
      SocketAcceptorConfig cfg = new SocketAcceptorConfig(); 
      cfg.getFilterChain().addLast("codec", codec); 

      try { 
        acceptor.bind(socketAddress, this, cfg); 
      } catch (IOException e) { 
        log.error(Trace.getStackTrace(e)); 
      } 
    } 

    public void unbind() { 
      log.info("unbind " + socketPort); 
      acceptor.unbind(new InetSocketAddress(socketPort)); 
    } 
} 
関連する問題