我搜索了互联网,但我找不到我的问题。 我有我的客户端类,我的服务器类和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:贾斯帕是对的。我使用追加,现在它的工作原理。感谢。
答案 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 Tables和How 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?
只记得当你试图读取数据包时,有人应该先写数据。