Добрый день, 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());
}
}
}