嘿那里堆栈溢出。
所以我一直在开发一个聊天程序来教自己一些 Java,我让它运行到任意数量的客户端都可以自由连接到服务器的地步,但每个客户端只能与服务器通信。
这显然是一个糟糕的聊天程序,所以我实现了一个处理程序数组列表,目的是将一个客户端写入的内容发送给所有客户端。问题是我无法让它工作,现在我在客户端和服务器之间输入了 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.");
}
}
}
至于客户,我想我应该在突出显示的部分更改一些内容,但我不确定是什么。
客户代码:
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.");
}
}
}