2015-04-02 51 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; 
} 
相關問題