Search code examples
javaserversocket

JAVA How to Loop Socket Variable


Im creating a simple client server program in java.

What I want to do is iterate variable so I can shorten my code. Here it is.

             Socket b1 = ss.accept();
             Socket b2 = ss.accept();
             Socket b3 = ss.accept();
        if(b1.isConnected()){
             System.out.println("Player from " + (b1.getLocalAddress().toString().substring(1) + ":" + b1.getLocalPort() + " has joined."));
        }

        DataOutputStream b1o = new DataOutputStream(b1.getOutputStream());
        BufferedReader b1i = new BufferedReader( new InputStreamReader (b1.getInputStream()));

        if(b2.isConnected()){
             System.out.println("Player from " + (b2.getLocalAddress().toString().substring(1) + ":" + b2.getLocalPort() + " has joined."));
        }

        DataOutputStream b2o = new DataOutputStream(b2.getOutputStream());
        BufferedReader b2i = new BufferedReader( new InputStreamReader (b.getInputStream()));

        if(b3.isConnected()){
        System.out.println("Player from " + (b3.getLocalAddress().toString().substring(1) + ":" + b3.getLocalPort() + " has joined."));
        }

        DataOutputStream b3o = new DataOutputStream(b3.getOutputStream());
        BufferedReader b3i = new BufferedReader( new InputStreamReader (b3.getInputStream()));

Is there any way to loop variable name so it goes b1 at first loop, then b2, so on. Thanks in advance.


Solution

  • As MadProgrammer said, it is best to start a new thread on every connection, as ss.accept() blocks. You can try something like this:

    Socket b;
    ServerSocket ss;
    ClientConnection newClient;
    Thread newThread;
    
    while(true) {
        try {
            b = ss.accept();
    
            System.out.println("Player from " + (b.getLocalAddress().toString().substring(1) + ":" + b.getLocalPort() + " has joined."));
            newClient = new ClientConnection(b);
    
            newThread = new Thread(newClient);
            newThread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    class ClientConnection implements Runnable {
    
        //each connection should have its own socket and streams
        private Socket socket;
        private ObjectOutputStream outputStream;
        private ObjectInputStream inputStream;
    
        public ClientConnection(Socket socket) {
           this.socket = socket;
           this.outputStream = new ObjectOutputStream(socket.getOutputStream());
           this.inputStream = new ObjectInputStream(socket.getInputStream());
        }
    
        @Override
        public void run() {
            //do stuff with connection you have
        }
    }
    

    I would also recommend keeping an array of your connections so you don't lose them.