服务器不接受在NIO人数超过一个客户端(server not accepting morethan

2019-09-18 06:27发布

我试图建立一个聊天application.i具有从客户端发送数据到服务器代码。 当一个或多个客户端登录(运行客户端程序的一个或更多的时间时).server将不接受比第一个连接的其他连接的其余部分。 请帮我在这里解决,这是我的代码:

public class Server
{

//Creating non blocking socket

public void non_Socket() throws Exception {

    ServerSocketChannel ssChannel = ServerSocketChannel.open();
    int port = 80;
    int i=0;
    ssChannel.socket().bind(new InetSocketAddress(port));
    ssChannel.configureBlocking(false);
    while(true)
    {
        SocketChannel sc = ssChannel.accept();`

        if (sc == null) 
        {
            System.out.println("Socket channel is null");
            Thread.sleep(5000);
        }
        else 
        {
            System.out.println("Socket channel is not null");
            System.out.println("Received an incoming connection from " +
                    sc.socket().getRemoteSocketAddress()); 
            new PrintRequest(sc,i).start(); 
            i++;
        }
    }
}

public static void main(String [] abc) throws Exception
{
    new Server().non_Socket();
}
}

class PrintRequest extends Thread {

public  PrintRequest(SocketChannel sc,int i) throws Exception
{
    WritableByteChannel wbc = Channels.newChannel(System.out); 
    ByteBuffer b = ByteBuffer.allocateDirect(1024); // read 1024 bytes 
    int numBytesRead = sc.read(b);

    while (numBytesRead != -1) 
    {
        b.flip();

        while (b.hasRemaining())
        { 
            wbc.write(b);
            System.out.println();
            //System.out.println("Stream  "+i);
            // System.out.println("  KKK   "+b.toString());
        }
        //b.clear();
    }    
}
}

客户代码:

public class Client extends Thread {

public void non_Client_Socket() throws Exception
{
    SocketChannel sChannel = SocketChannel.open();
    sChannel.configureBlocking(false);
    sChannel.connect(new InetSocketAddress("localhost", 80));
    while (!sChannel.finishConnect())
    {
        System.out.println("Channel is not connected yet");
    }

    System.out.println("Channel is ready to use");

    /* ----------  going to send data to server ------------*/   
    System.out.println("please enter the text");
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    while(true)
    {
        System.out.println("Enter the text");
        String HELLO_REQUEST =stdin.readLine().toString();
        if(HELLO_REQUEST.equalsIgnoreCase("end"))
        {
            break;
        }

        System.out.println("Sending a request to HelloServer");    
        ByteBuffer buffer = ByteBuffer.wrap(HELLO_REQUEST.getBytes());    
        sChannel.write(buffer); 
     }
}
     /* ----------  the data is written to sChannel server
                      will read from this channel  ------------   */

public static void main(String [] args) throws Exception
{
    new Client().non_Client_Socket();
}
}

Answer 1:

这里有许多的问题。

  1. 你把你ServerSocketChannel成非阻塞模式,然后调用accept() ,而不使用选择。 这意味着时间99.9999% accept()将返回null,所以你燃烧的CPU周期。 这是毫无意义的。 无论是在阻塞模式接受或使用一个选择。

  2. 你把你的客户端SocketChannel成非阻塞模式,调用connect(),而调用finishConnect()不使用选择。 这意味着99%的时间finishConnect()将返回false,那么你正在燃烧的CPU周期。 这是毫无意义的。 无论是在阻塞模式连接或使用一个选择器。

  3. 你是忽略的结果SocketChannel.write() 你不能做到这一点。 它返回你需要了解的信息。

总之,你的代码没有太大的意义。



Answer 2:

我没有时间寻找到你的代码中的细节,但一些初步意见:

  1. 当使用NIO,我建议你使用Selector (如我建议你前面的问题 ),而不是每个客户端一个线程。

  2. 记住要bind每个客户端,以使服务器套接字accept新的连接。



文章来源: server not accepting morethan one client in nio