2011-07-19 48 views
3

嗨,我使用下面的代碼在服務器端對多個客戶端連接..Java:帶有多個連接的Handelling套接字?

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

嘗試指定客戶的最大數量爲

serverSocket = new ServerSocket(3000,10); 

這應該接受高達10個連接,而無需任何問題。 此外,您可以使用netstat -a來檢查您的統計數據,即使與一個客戶端建立連接並且已將3001(或更大)/ 2999(或更少)端口分配給現有客戶端,也會顯示端口3000仍在監聽。

+0

@bt問題是不是連接數!!有時第二個客戶端還要timout..if只有一個客戶端連接 – Harinder

+0

是這是從你的角度看待多個連接的正確方法? – Harinder

+0

是的,我認爲。你有沒有檢查過這個命令的輸出「netstat -a」?它應該像你的3000端口應該一直處於監聽狀態,並且有一個本地端口說TIME_WAIT,並且建立的連接應該處於ESTABLISHED狀態。 – peeyush

0

您是否正在考慮使用框架? 這給一試:Apache MINA

示例代碼:

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)); 
    } 
}