小编典典

使用nio在Java中不阻塞客户端服务器聊天应用程序

java

我使用nio频道构建了一个简单的聊天应用程序。我对网络和线程非常陌生。该应用程序用于与服务器通信(服务器/客户端聊天应用程序)。

我的问题是服务器不支持多个客户端。我该如何解决这个问题?我的代码中的错误是什么?

public class Clientcore extends Thread
{

    SelectionKey selkey=null;
    Selector sckt_manager=null;
    public void coreClient()
    {
       System.out.println("please enter the text");
       BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
       SocketChannel sc = null;
        try
        { sc = SocketChannel.open();
            sc.configureBlocking(false);       
            sc.connect(new InetSocketAddress(8888));  
            int i=0;
           while (!sc.finishConnect())
            {   
            } 
            for(int ii=0;ii>-22;ii++)
            {
                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());    
                sc.write(buffer); 
            }   
        } 
        catch (IOException e) 
        {          
            e.printStackTrace();    
        }
        finally
        {       
            if (sc != null)
            {            
                try 
                {             
                    sc.close();            
                }
                catch (Exception e)
                {           
                    e.printStackTrace();       
                }       
            } 
            }   }

     public void run()
     {
      try
      {
        coreClient();
      }
      catch(Exception ej)
      {
         ej.printStackTrace();
      }}}

public class ServerCore extends Thread
{

    SelectionKey selkey=null;
    Selector sckt_manager=null;
      public void run()
     {
        try
        {
            coreServer();
        }
        catch(Exception ej)
        {
            ej.printStackTrace();
        }
     }

    private void coreServer() 
    {
        try
        {
            ServerSocketChannel ssc = ServerSocketChannel.open();
              try
                 {   
                    ssc.socket().bind(new InetSocketAddress(8888));

                     while (true)
                     {

                         sckt_manager=SelectorProvider.provider().openSelector();
                         ssc.configureBlocking(false);   
                         SocketChannel sc = ssc.accept();
                         register_server(ssc,SelectionKey.OP_ACCEPT);
                        if (sc == null) 
                         {   
                        } 
                         else
                            {

                                System.out.println("Received an incoming connection from " + sc.socket().getRemoteSocketAddress()); 
                                printRequest(sc); 
                                System.err.println("testing 1");
                                String HELLO_REPLY = "Sample Display";
                                ByteBuffer buffer = ByteBuffer.wrap(HELLO_REPLY.getBytes());
                                System.err.println("testing 2");
                                sc.write(buffer); 
                                System.err.println("testing 3");
                                sc.close();
                            }}}
              catch (IOException e)
              { 
                   e.printStackTrace(); 
              }
               finally
              { 
                   if (ssc != null) 
                   { 
                    try 
                    { 
                            ssc.close(); 
                    }
                    catch (IOException e) 
                    { 
                            e.printStackTrace(); 
                    }
                   }
               }
        }
        catch(Exception E)
        {
            System.out.println("Ex in servCORE   "+E);
        }    
    }


    private static void printRequest(SocketChannel sc) throws IOException
          {

                ReadableByteChannel rbc = Channels.newChannel(sc.socket().getInputStream()); 
                 WritableByteChannel wbc = Channels.newChannel(System.out); 
                 ByteBuffer b = ByteBuffer.allocate(1024); // read 1024 bytes  
                 while (rbc.read(b) != -1) 
                 {
                    b.flip();
                    while (b.hasRemaining())
                    { 
                         wbc.write(b);
                         System.out.println();
                    }
                    b.clear();
                 }
          }
     public void register_server(ServerSocketChannel ssc,int selectionkey_ops)throws Exception
      {
        ssc.register(sckt_manager,selectionkey_ops);
       }}

public class HelloClient
{

  public void coreClientChat() 
    {
        Clientcore t=new Clientcore();
        new Thread(t).start();
    }

    public static void main(String[] args)throws Exception
    {     
       HelloClient cl= new HelloClient();
       cl.coreClientChat();
    }}
public class HelloServer
    {

          public void coreServerChat()
          {
              ServerCore t=new ServerCore();
              new Thread(t).start();
          }

          public static void main(String[] args)
          {    
             HelloServer st= new HelloServer();
             st.coreServerChat();

          }}

阅读 211

收藏
2020-11-23

共1个答案

小编典典

初学者Hello NIO
Server的
理想之地

2020-11-23