简体   繁体   中英

Threads on client server [java]

I'm trying to do multi client server. I already setup server with multithreading. And my question is How Can I join(run) for example 20 clients at one time? I need to use threads aswell? I'm thinking about creating constructor with my client to set connection and get random name and then create loop which go through 20 of them and set them up? Here is the code: //Server

package com.multi;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static final int PORT = 4445;


    public void startServer(){
        try {
            ServerSocket server = new ServerSocket(PORT);
            System.out.println("Server is waiting for connetions...");

            while (true) {
                Socket socket = server.accept();
                new ServerThread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    public static void main(String[] args){
        new Server().startServer();
    }

}

//server multithreading

package com.multi;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerThread extends Thread {
    Socket socket;
    String message = null;

    ServerThread(Socket socket) {
        this.socket = socket;
    }
    public void run(){
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while ((message = bufferedReader.readLine()) != null){
                System.out.println("Client: " + message);
            }
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

//client

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class Client extends JFrame{

    private String[] names = { "Sara", "Jessica", "Tom", "Emanuel", "Joshua",
            "Kristin", "Kirito", "Goku", "Bulma" };
    private JTextField chatWindow;

    public void clientJoin() {
        for (String name : names) {

            try {
                chatWindow = new JTextField();
                add(new JScrollPane(chatWindow));
                setSize(300, 150);
                setVisible(true);
                Socket socket = new Socket("localhost", 4445);
                PrintWriter printWriter = new PrintWriter(
                        socket.getOutputStream(), true);
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(System.in));
                System.out.println(name);
                while (true) {
                    String readerInput = bufferedReader.readLine();
                    printWriter.println(name + ": " + readerInput);
                    chatWindow.setText(name);
                }
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {

        for (int i = 0; i < 3; i++) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    new Client().clientJoin();
                }
            };
            new Thread(r).start();            
        }

    }

}

If you want to test concurrent access, then yes, you need to start 20 client threads. Something like:

for (int i = 0; i < 20; i++) {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            startAClient();
        }
    };
    new Thread(r).start();            
}

This worked for me:

    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class Client extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static String[] names = new String[]{ "Sara", "Jessica", "Tom", "Emanuel", "Joshua",
            "Kristin", "Kirito", "Goku", "Bulma" };
    private JTextField chatWindow;
    private static int c = 0;

    public void clientJoin(String name) {


            try {
                chatWindow = new JTextField();
                add(new JScrollPane(chatWindow));
                setSize(300, 150);
                setVisible(true);
                Socket socket = new Socket("localhost", 4444);
                PrintWriter printWriter = new PrintWriter(
                        socket.getOutputStream(), true);
                BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(System.in));
                System.out.println(name);

                System.out.println(name);
                while (true) {
                    String readerInput = bufferedReader.readLine();
                    printWriter.println(name + ": " + readerInput);
                    chatWindow.setText(name);
                }
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            }

    }

    public static void main(String[] args) {
        while (c < names.length-1) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    new Client().clientJoin(names[c]);
                }
            };
            new Thread(r).start();
            System.out.println("ges here");
            c++;
        }

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM