Java客户端服务器应用程序,无法发送ArrayList

时间:2014-06-15 21:29:30

标签: java arraylist

我搜索了互联网,但我找不到我的问题。 我有我的客户端类,我的服务器类和Loc类。在我的客户端类中,我有一个Jtext字段,我希望填充值(空闲/占用),具体取决于座位是否空闲。

在我的服务器类中,我填充了一个所有座位都空闲的ArrayList。我想将这个ArrayList传递给我的客户端,同时显示免费的OCCUPIED。 但我只能传递我的第一个价值。 这是服务器类:

public static void main(String [] args){

ServerSocket client = null;
Loc l = new Loc();

    try {
         ArrayList<Loc> lista = new ArrayList<>();
        for (int i=0;i<7;i++)
            for(int j=0;j<6;j++)
        {
            l.setLoc(i);
            l.setRand(j);
            lista.add(l);
        }
        client = new ServerSocket(9000);
        Socket socket = client.accept();
        ObjectInputStream dis = new ObjectInputStream(socket.getInputStream());
        ObjectOutputStream dos = new ObjectOutputStream(socket.getOutputStream());

        l = (Loc) dis.readObject();
        System.out.println(l.getRand());
       // Loc a = new Loc("ags",2, 42, 125);

        dos.writeObject(lista);


    } catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    }
}

这是我的客户端类:

public class Client_Gui extends javax.swing.JFrame {

Socket socket = null;
ObjectOutputStream dos = null;
ObjectInputStream dis= null;
// ObjectOutputStream dos = null;
ArrayList<Loc> lst  = new ArrayList<>();
Loc locul = new Loc();
/**
 * Creates new form Client_Gui
 */
public Client_Gui() {
    initComponents();

    Loc  loc = new Loc();
    try {
        ArrayList<Loc> lst = null;
        socket = new Socket("localhost",9000);           
        dos = new ObjectOutputStream(socket.getOutputStream());
        dis = new ObjectInputStream(socket.getInputStream());
        dos.writeObject(loc);
        lst = (ArrayList<Loc>) dis.readObject();
        for(Loc a : lst){
           if(a.getIdSpectator().equals("") == true)
                        txt_area.setText("Liber");
                     else 
                       txt_area.setText("Ocupat");
       }



    } catch (IOException ex) {
        Logger.getLogger(Client_Gui.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Client_Gui.class.getName()).log(Level.SEVERE, null, ex);
    }

}

另一个与此相关的问题。我可以运行我的客户端/服务器应用程序而不先从客户端发送一些信息吗?我的意思是,起初我首先尝试从客户端读取然后写入服务器,但我得到了错误。在我改变后,首先我从客户端写入然后读取,正常工作,直到它到达ArrayList的那个部分。

编辑:我试图硬编码,在我的客户端类中,我把代码创建的数组列表。 现在,当我想在文本字段中显示它时,仍然只显示第一个值。我的语法错了吗? 我用过:

          for(Loc a : lista){
           if(a.getIdSpectator().equals("") == true)
                        txt_area.setText("Liber");                            
                     else 
                       txt_area.setText("Ocupat ");
            }
编辑2:贾斯帕是对的。我使用追加,现在它的工作原理。感谢。

2 个答案:

答案 0 :(得分:1)

看看你如何在服务器上构建列表......

ArrayList<Loc> lista = new ArrayList<>();
for (int i=0;i<7;i++)
    for(int j=0;j<6;j++)
    {
        l.setLoc(i);
        l.setRand(j);
        lista.add(l);
    }

基本上,所有这一切都是将l的相同实例添加到数组列表中,但在每个循环中,您正在更改其属性。这意味着,您最终会得到具有相同属性的相同对象的列表(因为它只是对象的单个实例)

你应该做的是在循环的每次迭代中创建一个l的新实例,仅根据列表设置其属性,并将其设置为列表

<强>更新

好的,在客户端,您正在使用

设置JTextArea的文本
for(Loc a : lst){
    if(a.getIdSpectator().equals("") == true)
        txt_area.setText("Liber");
    else 
        txt_area.setText("Ocupat");
}

setText用提供的文本替换字段的内容。相反,您想尝试使用append

for(Loc a : lst){
    if(a.getIdSpectator().equals("") == true)
        txt_area.append("Liber");
    else 
        txt_area.append("Ocupat");
}

话虽如此,我强烈建议您考虑查看How to Use TablesHow to Use Lists更适合显示此类数据的组件

答案 1 :(得分:0)

您需要将其放在loop中,以便服务器接收从套接字传递的所有值,而不仅仅是您发送的第一个值。

示例:

在服务器

ObjectOutputStream dos = new ObjectOutputStream(socket.getOutputStream());

dos.writeObject(lista);

while(true)
{
    l = (Loc) dis.readObject();
    System.out.println(l.getRand());
   // Loc a = new Loc("ags",2, 42, 125);
}

在客户端

    dis = new ObjectInputStream(socket.getInputStream());

    lst = (ArrayList<Loc>) dis.readObject();
    for(Loc a : lst){
       if(a.getIdSpectator().equals("") == true)
                    txt_area.setText("Liber");
                 else 
                   txt_area.setText("Ocupat");
   }

你的问题:

Can i run my client/server application without sending first some information from the client? 

只记得当你试图读取数据包时,有人应该先写数据。