gpt4 book ai didi

java - ArrayList 大小在服务器和客户端之间不持久

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:46 25 4
gpt4 key购买 nike

我正在用 Java 编写服务器/客户端聊天应用程序。为了接收消息然后打印对话的整个对话,我将来自客户端的每条消息添加到字符串的 ArrayList,然后将整个 ArrayList 发送回客户端,作为整个对话打印出来。

我的问题是,即使我不断地向服务器中的 ArrayList 添加元素,每当我将它发送到客户端时,大小都不会改变,并且只存储第一个元素。

服务器程序:

public class ArrayListServer {


public static void main(String[] args) {
int port = 8000;
String me = "Server: ";
ArrayList<String> convo = new ArrayList<String>();
try {
ServerSocket server = new ServerSocket(port);
System.out.println("Waiting for connection...");
Socket client = server.accept();
System.out.println("Established connection.");
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
int i = 0;
// receive messages from client
while (true) {
String msgFromClient = (String)in.readObject();
convo.add(msgFromClient);
System.out.println(me + "size: " + convo.size());
out.writeObject(convo);
}
} catch (IOException ioex) {
System.out.println("IOException occurred.");
} catch (ClassNotFoundException cnfex) {
System.out.println("ClassNotFoundException occurred.");
}

}

}

客户端程序:

public class ArrayListClient {

@SuppressWarnings("unchecked")
public static void main(String[] args) {
int port = 8000;
String me = "Client: ";
Scanner input = new Scanner(System.in);
ArrayList<String> convo = new ArrayList<String>();
try {
Socket client = new Socket("localhost", port);
ObjectOutputStream toServer = new ObjectOutputStream(client.getOutputStream());
ObjectInputStream fromServer = new ObjectInputStream(client.getInputStream());
while (true) {
System.out.print("> ");
String msg = input.nextLine().trim();
toServer.writeObject(msg);
convo = (ArrayList<String>)fromServer.readObject();
System.out.println(me + "size: " + convo.size());
}
} catch (UnknownHostException uhex) {
System.out.println("UnknownHostException occurred.");
} catch (IOException ioex) {
System.out.println("IOException occurred.");
} catch (ClassNotFoundException cnfex) {
System.out.println("ClassNotFoundException occurred.");
}
}

}

当我运行服务器和客户端时,我的输出是:

> hi
Client: size: 1
> hi
Client: size: 1
> hi
Client: size: 1
> hi
Client: size: 1
> hi
Client: size: 1
> hi
Client: size: 1
>

Server: Waiting for connection...
Server: Established connection.
Server: size: 1
Server: size: 2
Server: size: 3
Server: size: 4
Server: size: 5
Server: size: 6

我知道 ArrayList<>String类都是可序列化的,所以我不知道为什么这不起作用。我认为这可能与我的输入/输出流有关,但是当我将它们声明为本地 while 循环并在循环结束时关闭它们时,我的程序会抛出 IOException 并停止。

我做错了什么?

最佳答案

我解决了。您使用相同的 ObjectOutput 和 ObjectInput 实例。 ObjectOutput 尝试不重写它之前看到的实例。因此,服务器第一次写入 convo 数组列表时,它会保留对它的引用。当您添加到它时,即使列表的内容发生变化,引用也不会改变。如果您在服务器中进行以下一行更改,这将向您证明这是问题所在:

out.writeObject( new ArrayList( convo ) );

以上并不是一个很好的解决方案,因为 ObjectOutputStream 的引用 map 将在每次迭代中不断增长。但它会告诉您问题出在哪里,以便您创建更好的解决方案。

更好的解决方案是在两侧的循环中移动 getInputStream 和 getOutputStream 行。

此外,如果字符串工作不明显,因为在每次迭代中它们都是不同的对象引用。 List 不会,因为在服务器端您每次都编写相同的引用,即使它发生了变化。

关于java - ArrayList<String> 大小在服务器和客户端之间不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21651128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com