Java:处理多个连接的套接字?

时间:2011-07-19 06:57:44

标签: java multithreading sockets

您好我在服务器端使用以下代码连接多个客户端..

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 个答案:

答案 0 :(得分:4)

尝试将最大客户端数量指定为

serverSocket = new ServerSocket(3000,10);

这里它应该接受最多10个连接而没有任何问题。 此外,您可以使用netstat -a检查您的统计信息,即使在与一个客户端建立连接并为您的现有客户端分配了3001(或更高)/ 2999(或更小)端口后,端口3000仍在监听。 / p>

答案 1 :(得分: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));
    }
}