java - 您如何知道如何限制可以进入基本群聊应用程序服务器的客户端数量? (最多 10 个)

标签 java

所以这是我的代码: 服务器.java

import java.io.*;
import java.net.*;
import java.util.*;

class Server implements Runnable{
            Socket connectionSocket;     
            public static Vector clients=new Vector();
            public Server(Socket s){
                    try{
                            System.out.println("Client Got Connected  " );
                            connectionSocket=s;
                    }catch(Exception e){e.printStackTrace();}
            }     
            public void run(){
                    try{
                            BufferedReader reader =
                                            new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
                            BufferedWriter writer= 
                                            new BufferedWriter(new OutputStreamWriter(connectionSocket.getOutputStream()));

                            clients.add(writer); 

                        while(true){
                            String data1 = reader.readLine().trim();
                            System.out.println("Received : "+data1);      

                            for (int i=0;i<clients.size();i++){
                               try{
                                    BufferedWriter bw= (BufferedWriter)clients.get(i);
                                    bw.write(data1);
                                    bw.write("\r\n");
                                    bw.flush();
                                }catch(Exception e){e.printStackTrace();}
                            }
                        }
                    }catch(Exception e){e.printStackTrace();}
        }
        public static void main(String argv[]) throws Exception{
            System.out.println("Threaded Chat Server is Running  " );
            ServerSocket mysocket = new ServerSocket(5555);
                while(true){
                Socket sock = mysocket.accept();
                Server server=new Server(sock);
                Thread serverThread=new Thread(server);
                serverThread.start();
                }
            }
}

mychat.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;


public class mychat implements Runnable
{
    public JTextField tx;
    public JTextArea ta;

    public String login="Imed";

    BufferedWriter writer;
    BufferedReader reader;

    public mychat(String l)
    {
        login=l;        
        ClientName z = new ClientName();
        JFrame f=new JFrame(z.getName()+"'s Chat");
        f.setSize(400,400);        

        JPanel p1=new JPanel();
        p1.setLayout(new BorderLayout());

        JPanel p2=new JPanel();
        p2.setLayout(new BorderLayout());        

        tx=new JTextField();
        p1.add(tx, BorderLayout.CENTER);

        JButton b1=new JButton("Send");
        p1.add(b1, BorderLayout.EAST); 

        ta=new JTextArea();
        p2.add(ta, BorderLayout.CENTER);
        p2.add(p1, BorderLayout.SOUTH);

        f.setContentPane(p2);



        try
        {
                 Socket socketClient= new Socket("localhost",5555);
                 writer= new BufferedWriter(new OutputStreamWriter(socketClient.getOutputStream()));

                 reader =new BufferedReader(new InputStreamReader(socketClient.getInputStream()));




        }

        catch(Exception e){e.printStackTrace();}


        b1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ev)
            {
                String s=login+" : "+tx.getText();  
                tx.setText("");
                try
                {
                    writer.write(s);
                    writer.write("\r\n");
                    writer.flush(); 
                }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }
            }
          }
        );

        f.setVisible(true);    


    }
    public void run()
    {
             try
             {
                String serverMsg=""; 
                while((serverMsg = reader.readLine()) != null)
                {
                    System.out.println("from server: " + serverMsg);
                    ta.append(serverMsg+"\n");
                }
             }
        catch(Exception e)
        {
            e.printStackTrace();
        }   
    }
}

startclient.java


public class startclient
{

        public static void main(String [] args)
        {

                   try
                   {

                            ClientName n = new ClientName();
                            mychat c=new mychat(n.getName());   
                            Thread t1=new Thread(c);
                            t1.start();
                    }
           catch(Exception e){e.printStackTrace();}

        }
    }

最后一个ClientName.java

import java.util.*;

public class ClientName 
{
    String name;

    public String getName() 
    {
     Scanner sc = new Scanner(System.in);
     System.out.print ("Enter your name : ");
     name = sc.nextLine();
     return name; 
    }
}

所以基本上,我想限制可以加入我的服务器的客户端数量(最多 10 个客户端)。如果服务器满后还有另一个客户端想要加入服务器,则该客户端将被拒绝,因此无法加入。 我认为就是这样,但如果我的代码的其他领域有任何其他改进,我们也会不胜感激。抱歉我的英语不好

*哦,抱歉,因为我忘记包含它,但不知何故,当我启动客户端时,它询问了两次名称

最佳答案

您可以修复服务器中的 main 方法并添加 sayGoodBye(),如下所示:

private static final int CONNECTION_LIMIT = 10;

public static void main(String argv[]) throws Exception {
    System.out.println("Threaded Chat Server is Running  ");
    ServerSocket mysocket = new ServerSocket(5555);
    int socketCount = 0;
    while (true) {
        Socket sock = mysocket.accept();
        Server server = new Server(sock);
        if (socketCount++ < CONNECTION_LIMIT) {
            Thread serverThread = new Thread(server);
            serverThread.start();
         } else {
            // without starting a thread and notifying only new client
            server.sayGoodbye();  
         }
    }
}

public void sayGoodbye() throws IOException {
    try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connectionSocket.getOutputStream()))) {
        writer.write("Sorry, new client connections are not accepted, bye for now");
    } catch (Exception e) {
        e.printStackTrace();
    }
    connectionSocket.close();
}

关于java - 您如何知道如何限制可以进入基本群聊应用程序服务器的客户端数量? (最多 10 个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61369720/

相关文章:

java - 比较 Java 中的字符、整数和类似类型 : Use equals or ==?

java - 使用 Junit 生成多个单元测试

java - 如何显示图像的RGB值直方图?

java - 使用 android AccountManager 获取 OAuth2 token ?

java - 列表 数组 列表 转换

java - 日期的字符串解析、JSON Stringify 和 GSON 解析失败

java - libGdx:大于屏幕的可滚动阶段

java - 如何制作由JAR和JRE组成的EXE文件

java-8 - 检查中午前和下午后

java - CachedThreadPool 与 FixedThreadPool