簡體   English   中英

Java:處理具有多個連接的套接字?

[英]Java:Handelling socket with multiple connections?

嗨,我在服務器端使用以下代碼來連接多個客戶端。

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

但是當多個客戶端連接到我的服務器時,其中一些超時,為什么我這邊會延遲立即接受連接?

嘗試將最大客戶端數指定為

serverSocket = new ServerSocket(3000,10);

在這里它應該接受多達 10 個連接而不會出現任何問題。 此外,您可以使用netstat -a檢查您的統計信息,這將顯示端口 3000 即使在與一個客戶端建立連接並且已為現有客戶端分配 3001(或更大)/2999(或更小)端口后仍在偵聽。

您是否正在考慮使用框架? 試試這個: 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));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM