2015-04-02 49 views
0

我的程序在执行过程中遇到错误,因为NewServer中的arrlist元素没有被复制到MyConnection。我该怎么办?如何将数组列表的元素从另一个类复制到另一个类

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; 
    } 
} 

这里的NEWSERVER

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); 
    } 
} 
+0

也许我失去了一些东西 - 但我无法找到你的代码中的任何地方,你实际上把对象放入你的数组列表中。只要创建一个空的数组列表就不会神奇地将对象放入其中。 **附注**:在'sendtoAll'中迭代你的arrlist的方式是不好的做法。只需使用for(MyConnection con:arrlist){' 这种“downcouting”方法给读者增加了很多潜在的困惑;在性能上获得(非常小的)收益。根本不要这样做。 – GhostCat 2015-04-02 07:35:38

+0

MyConnection t = new MyConnection(s,arrlist); arrlist.add(t); – user3339866 2015-04-02 07:37:17

+2

你调试了你的代码吗?尝试使用调试器。 – Touchstone 2015-04-02 07:45:53

回答

0

你将无法编辑你迭代的列表,你可以这样做:

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; 
} 
相关问题