Java 如何将数组列表的元素从另一个类复制到另一个类
我的程序在执行过程中遇到错误,因为NewServer中的arrlist元素没有复制到MyConnection。我该怎么办 MyConnection负责发送和获取消息,并负责将消息分发给所有客户端Java 如何将数组列表的元素从另一个类复制到另一个类,java,Java,我的程序在执行过程中遇到错误,因为NewServer中的arrlist元素没有复制到MyConnection。我该怎么办 MyConnection负责发送和获取消息,并负责将消息分发给所有客户端 public class MyConnection extends Thread{ Socket s; BufferedReader in; PrintWriter out; String reps, msg; ArrayList<MyConnection&
public class MyConnection extends Thread{
Socket s;
BufferedReader in;
PrintWriter out;
String reps, msg;
ArrayList<MyConnection> arrlist;
MyConnection(Socket s, ArrayList<MyConnection> arrlist){
this.arrlist = arrlist;
this.s = s;
try{
this.in= new BufferedReader(new InputStreamReader(s.getInputStream()));
this.out= new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
}catch(IOException e){
System.out.println("Something Bad Happened " + e);
}
}
boolean sendMessage(String msg){
try{
NewServer server = new NewServer();
server.sendtoAll(msg);
out.println(msg);
out.flush();
System.out.println(server.arrlist.size());
return true;
}catch (Exception e) {
System.out.println("S: Something bad happened :(");
e.printStackTrace();
return false;
}
}
String getMessage(){
try{
reps = in.readLine();
}catch (Exception e) {
System.out.println("S: Something bad happened :(");
e.printStackTrace();
}
return reps;
}
}
公共类MyConnection扩展线程{
插座;
缓冲读取器;
打印输出;
字符串重复,msg;
ArrayList;
MyConnection(套接字s、ArrayList和arrlist){
this.arrlist=arrlist;
这个.s=s;
试一试{
this.in=new BufferedReader(new InputStreamReader(s.getInputStream());
this.out=新的PrintWriter(新的OutputStreamWriter(s.getOutputStream());
}捕获(IOE异常){
System.out.println(“发生了不好的事情”+e);
}
}
布尔sendMessage(字符串消息){
试一试{
NewServer server=新的NewServer();
server.sendtoAll(msg);
out.println(msg);
out.flush();
System.out.println(server.arrlist.size());
返回true;
}捕获(例外e){
System.out.println(“S:发生了不好的事情:(”);
e、 printStackTrace();
返回false;
}
}
字符串getMessage(){
试试{
reps=in.readLine();
}捕获(例外e){
System.out.println(“S:发生了不好的事情:(”);
e、 printStackTrace();
}
返回代表;
}
}
这是新闻服务器
public class NewServer{
static ArrayList<MyConnection> arrlist = new ArrayList<MyConnection>();
static boolean push;
static Socket s;
public void sendtoAll(String message){
for(int i= arrlist.size(); i >= 0; i--){
MyConnection t3 = arrlist.get(i);
t3.sendMessage(message);
if(!t3.sendMessage(message)){
arrlist.remove(i);
System.out.println("Client disconnected");
}
}
}
public static void main(String args[]){
try{
System.out.println("S: Starting server...");
ServerSocket ssocket = new ServerSocket(8888);
System.out.println("S: Waiting for connections...");
while(true){
s = ssocket.accept();
System.out.println("SOMEONE CONNECTEDDDDD" + arrlist.size());
MyConnection t = new MyConnection(s,arrlist);
arrlist.add(t); //put my connection to arrlist
t.start();
}
}catch(Exception e) {
System.out.println("Soooomething Bad Happened " + e);
}
}
公共类新闻服务器{
静态ArrayList arrlist=新ArrayList();
静态布尔推;
静态插座;
public void sendtoAll(字符串消息){
对于(int i=arrlist.size();i>=0;i--){
MyConnection t3=arrlist.get(i);
t3.发送消息(消息);
如果(!t3.sendMessage(消息)){
删除(i);
System.out.println(“客户端断开”);
}
}
}
公共静态void main(字符串参数[]){
试一试{
System.out.println(“S:启动服务器…”);
ServerSocket ssocket=新的ServerSocket(8888);
System.out.println(“S:等待连接…”);
while(true){
s=ssocket.accept();
System.out.println(“SOMEONE connectedddd”+arrlist.size());
MyConnection t=新的MyConnection(s,arrlist);
add(t);//将我的连接放到arrlist
t、 start();
}
}捕获(例外e){
System.out.println(“发生了错误”+e);
}
}
您将无法编辑正在迭代的列表,您可以执行以下操作:
public void sendtoAll(String message){
ArrayList<MyConnection> tempArrlist = new ArrayList<MyConnection>()
for(int i= arrlist.size(); i >= 0; i--){
MyConnection t3 = arrlist.get(i);
t3.sendMessage(message);
if(t3.sendMessage(message)){
tempArrlist.add(arrlist.get(i));
} else {
System.out.println("Client disconnected");
}
}
arrlist = tempArrlist;
}
public void sendtoAll(字符串消息){
ArrayList tempArrlist=新建ArrayList()
对于(int i=arrlist.size();i>=0;i--){
MyConnection t3=arrlist.get(i);
t3.发送消息(消息);
如果(t3.发送消息(消息)){
tempArrlist.add(arrlist.get(i));
}否则{
System.out.println(“客户端断开”);
}
}
arrlist=tempArrlist;
}
也许我遗漏了什么-但是我在代码中找不到任何地方可以将对象放入arraylist。仅仅创建一个空的arraylist并不会神奇地将对象放入arraylist。旁注:在sendtoAll
中迭代arrlist的方式是不好的做法。只需使用for(MyConnection con:arrlist){
这种“downcouting”方法给人类读者增加了很多潜在的困惑;为了(非常小的)性能提升。不要这样做。MyConnection t=新的MyConnection(s,arrlist);arrlist.add(t);您调试过代码吗?请尝试使用调试器。@EddyG a for each循环将导致从列表中删除某些内容。因此,这很可能不是最好的做法