【问题标题】:Java:Handelling socket with multiple connections?Java:处理具有多个连接的套接字?
【发布时间】:2011-07-19 06:57:44
【问题描述】:

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

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

但是当多个客户端连接到我的服务器时,其中一些超时,为什么我这边会延迟立即接受连接?

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

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

    serverSocket = new ServerSocket(3000,10);
    

    在这里它应该接受多达 10 个连接而不会出现任何问题。 此外,您可以使用netstat -a 检查您的统计信息,这将显示端口 3000 即使在与一个客户端建立连接并且已为您现有的客户端分配了 3001(或更大)/2999(或更小)端口后仍在侦听。

    【讨论】:

    • @bt 问题不在于连接数!!有时第二个客户端也会超时..如果只有一个客户端连接
    • 从您的角度来看,这是处理多个连接的正确方法吗?
    • 是的,我想。你检查过这个命令“netstat -a”的输出吗?它应该就像您的 3000 端口应该始终处于侦听状态,本地端口表示 TIME_WAIT 并且已建立的连接应该处于 ESTABLISHED 状态。
    • 嗯还有其他问题!!但这有帮助!!谢谢
    • 还有什么问题?我很想知道(并且为了将来参考,请通过在您的问题上发表编辑帖子让其他人知道),这将对其他人有所帮助....
    【解决方案2】:

    您是否正在考虑使用框架? 试试看: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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多