Эй, переполнение стека.ArrayList для многопользовательской чат-программы
Итак, я работал над программой чата, чтобы научить себя некоторой Java, и я работал с ней до такой степени, что любое количество клиентов могло свободно подключаться к серверу, но каждый клиент мог общаться только с сервером.
Это, очевидно, плохая чат-программа, поэтому я реализовал массивList обработчиков с целью отправки того, что один клиент пишет всем клиентам. Проблема в том, что я не мог заставить ее работать, и теперь моя программа вылетает после того, как я набрал 3 строки текста между клиентом и сервером.
Пожалуйста, взгляните на мой код. Я расскажу о разделах кода, который я изменил при попытке реализовать список массивов. Кажется, я просто застрял в неправильных местах.
Серверный код:
import java.io.*;
import java.net.*;
import java.util.*;;
public class Server{
//----------------------------------------------------
ArrayList<Handler> handlers = new ArrayList<Handler>();
//----------------------------------------------------
public static void main(String[] args){
try{
ServerSocket ss = new ServerSocket(8822);
while(true){
Socket s = ss.accept();
new Handler(s).start();
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
class Handler extends Thread{
Socket socket;
boolean notdone;
BufferedReader br;
PrintWriter pw;
String line;
public Handler(Socket socket){
this.socket = socket;
notdone = true;
}
public void run(){
//------------------
handlers.add(this);
//------------------
try{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
//--------------------------------------------------------
Iterator<Handler> handlerIterator = handlers.iterator();
//--------------------------------------------------------
while(notdone){
line = br.readLine();
if(line.equals("bye")){
System.out.println("Client said 'bye'");
notdone = false;
break;
}else{
System.out.println("Echo: " + line);
//----------------------------------------------
while (handlerIterator.hasNext()){
Handler current = handlerIterator.next();
current.pw.println(line);
}
//----------------------------------------------
}
}
br.close();
pw.close();
socket.close();
}catch(Exception e){
System.out.println(e);
System.out.println("Client severed connection.");
}
}
}
Что касается клиента, я думаю, что я должен что-то изменить в выделенном разделе, , но я не уверен, что.
Client Код:
import java.io.*;
import java.net.*;
import java.util.*;
public class Client{
public static void main(String[] args){
try{
Socket s = new Socket("localhost", 8822);
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true);
Scanner scan = new Scanner(System.in);
boolean notdone = true;
while(notdone){
String outString = scan.nextLine();
if(outString.equals("bye")){
pw.println(outString);
notdone = false;
}else{
//------------------
pw.println(outString);
String inString = br.readLine();
//------------------
System.out.println("Received: " + inString);
}
}
br.close();
pw.close();
s.close();
}catch(Exception e){
System.out.println("Server severed connection.");
}
}
}
Если вы разместите некоторый журнал, указав ошибку, было бы легче отладить. –
Ошибок нет. Он компилируется просто отлично. Когда я запускаю сервер и клиент в командной строке, он запускается, но после того, как я говорю, отправьте сервер, скажите .. привет дважды. Он просто висит. Если я закрою его, это просто даст мне мою отключенную связь, попробуй поймать. Существует логическая ошибка где-то с моим итератором или, возможно, «handlers.add (this)»; находится в неправильном месте. –
Как насчет того, чтобы вы печатали исключение в блоке catch? –