Как я могу отправить клиентов, которые мой P2P-сервер имеет другим клиентам в одноранговой сети? (JAVA) - PullRequest
0 голосов
/ 23 февраля 2020

Добрый день, StackOverflow,

У меня проблема, которая беспокоила меня в течение нескольких дней. Для моей курсовой работы мне нужно создать одноранговую сеть. Я могу объединить людей, но хочу, чтобы они все использовали одни и те же PrintWriters, чтобы они могли общаться друг с другом. Я перезапустил бесчисленное количество раз, чтобы найти способ общаться между собой. Буду признателен за любую помощь, спасибо!

Этот класс инициирует чат и создает потоки для индивидуальной обработки данных, данных, собираемых сервером, данных, отправляемых с клиента на сервер и клиентского узла пользователей.


import java.io.IOException;
import java.net.InetAddress;
import java.util.Random;

public class Chat {

    private static String ID;
    private static int SERVER_PORT;
    private static String HOST;
    private static int PORT;

    public static void main(String[] args) {
        Chat chat = new Chat(args[0], args[1], args[2], args[3]);
        chat.setup();
        chat.client(HOST, PORT);
        try {
            chat.client(InetAddress.getLocalHost().getHostAddress(), SERVER_PORT);
        }catch(IOException ex){
            System.out.println(ex.getLocalizedMessage());
        }
    }

    private Chat(String arg, String arg0, String arg1, String arg2) {
        Chat.ID = randomiseName(arg);
        Chat.SERVER_PORT = Integer.parseInt(arg0);
        Chat.PORT = Integer.parseInt(arg1);
        Chat.HOST = arg2;
    }

    private void setup() {
        ServerThread sThread = new ServerThread(SERVER_PORT);
        Thread thread = new Thread(sThread);
        thread.start();
    }

    private void client(String ip, int port) {
        ClientThread cThread = new ClientThread(ID, ip, port);
        Thread thread = new Thread(cThread);
        thread.start();
    }

    private String randomiseName(String id){
        String username = id + randNum(10) + randChar() ;
        return username;
    }

    private int randNum(int num){
        Random r = new Random();
        return r.nextInt(num);
    }

    private char randChar(){
        return "!#$%&?@~".charAt(randNum(12));

    }

}

Это серверный поток, который обрабатывает входящие передачи от пользователя.

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

class ServerThread implements Runnable {

    static Set<PrintWriter> writers = new HashSet<>();
    static Set<String> names = new HashSet<>();

    private final int SOCKET;

    ServerThread(int SERVER_PORT) {
        this.SOCKET = SERVER_PORT;
    }

    @Override
    public void run() {
        ExecutorService pool = Executors.newFixedThreadPool(500);
        System.out.print("INITIATING SERVER... ");
        try (ServerSocket listener = new ServerSocket(SOCKET)) {
            System.out.println("SUCCESS!");
            while (true) {
                pool.execute(new Handler(listener.accept()));
            }
        } catch (IOException ex) {
            Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private static class Handler implements Runnable {

        Socket socket;
        Scanner in;
        PrintWriter out;
        String name;

        private Handler(Socket s) {
            socket = s;
        }

        @Override
        public void run() {
            System.out.println("USER HAS CONNECTED");
            try {
                in = new Scanner(socket.getInputStream());
                out = new PrintWriter(socket.getOutputStream(), true);

                writers.add(out);

                out.println("GET_NAME");

                name = in.nextLine();

                names.add(name);
                names.add(name);

                System.out.println(names);

            } catch (Exception ex) {
                System.out.println(ex.getLocalizedMessage());
            }
        }

    }

    public void sendList() {
    }

}

Это клиентский поток, который обрабатывает передачу данных от клиента на сервер


import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

class ClientThread implements Runnable{

    private final String HOST;
    private final int PORT;
    private final String NAME;

    ClientThread(String ID, String HOST, int PORT) {
        this.NAME = ID;
        this.HOST = HOST;
        this.PORT = PORT;
    }

    @Override
    public void run() {
        try {
            Socket socket = new Socket(HOST, PORT);

            Scanner in = new Scanner(socket.getInputStream());
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            while(in.hasNextLine()){
                String line = in.nextLine();
                if(line.startsWith("GET_NAME")){
                    out.println(this.NAME);
                }
                if(line.startsWith(line)){

                }

            }

        } catch (IOException ex) {
            System.out.println(ex.getLocalizedMessage());
        }
    }

}
...