Java: сокет Handelling с несколькими подключениями? - PullRequest
3 голосов
/ 19 июля 2011

Привет! Я использую следующий код на стороне сервера для подключения нескольких клиентов.

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

но когда несколько клиентов подключаются к моему серверу, у некоторых из них истекает время ожидания, почему с моей стороны возникает задержка для мгновенного принятия соединения?

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

попробуйте указать максимальное количество клиентов как

serverSocket = new ServerSocket(3000,10);

Здесь он должен принимать до 10 соединений без каких-либо проблем. Более того, вы можете проверить свою статистику, используя netstat -a, что покажет, что порт 3000 все еще прослушивает даже после установления соединения с одним клиентом и назначил порт 3001 (или выше) / 2999 (или меньше) существующему клиенту.

0 голосов
/ 19 июля 2011

Вы планируете использовать фреймворк? Попробуйте: 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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...