Java TCP客户端服务器

Java TCP客户端服务器,java,serialization,tcp,Java,Serialization,Tcp,我有一个关于TCP客户机/服务器网络的问题。我正在尝试创建一个聊天应用程序。我的计划是让客户端通过网络发送对话对象(对象具有字符串username状态和字符串currentMessage状态)。我的问题是,我应该在每次发送消息时创建一个新对象吗?i、 每次我想发送新消息时,是否调用对话类构造函数?或者我应该只是更新当前消息状态??我有这个问题,因为目前,我只是更新状态,下面是发生的情况: currentMessage状态在客户端更新良好,但是当我通过网络发送对话对象并尝试在另一端检索curren

我有一个关于TCP客户机/服务器网络的问题。我正在尝试创建一个聊天应用程序。我的计划是让客户端通过网络发送对话对象(对象具有字符串username状态和字符串currentMessage状态)。我的问题是,我应该在每次发送消息时创建一个新对象吗?i、 每次我想发送新消息时,是否调用对话类构造函数?或者我应该只是更新当前消息状态??我有这个问题,因为目前,我只是更新状态,下面是发生的情况:

currentMessage状态在客户端更新良好,但是当我通过网络发送对话对象并尝试在另一端检索currentMessage状态时,我会一直获得原始状态值。为什么会这样?服务器一直引用我第一次发送的原始邮件值


PS我不想发布大量代码,所以我希望有人能大致了解我做错了什么

我猜你在使用ObjectOutputStream或类似的东西

不久前我自己也有这个问题。当您第一次发送时,它工作正常,但之后无法正常更新

这是因为流保存对象状态,如果再次发送,则不会更新。 您需要在收到对象后使用该方法使其再次更新。

您可以使用

基本上,你可以拥有一个始终相同的对象。您可以将其包装在另一个对象中。 在您的情况下,每次发送的对象都是相同的。你唯一要改变的就是文本

虽然我不确定你的代码是如何工作的,但在我看来,(1)每次创建一个要发送的新对象,或者(2)创建一个并不断设置要发送的不同文本(有点像flyweight)

前一种方法是,你可以预先分配一个大的信封列表,并在你发送邮件时一个一个地使用它们。这将提高性能


至于你的另一个问题,我同意w马特和哈斯拉姆的看法。您发送的内容可能已缓存,因此您需要刷新它,或者让Java知道它已更改。

您是否使用ObjectOutputStream类序列化对话对象?如果是这样,它将缓存您已经写入流的类,因此即使您在客户端更改值,每次写入该对象时,它都会发送指向该对象的指针,从而节省大量时间和带宽。不幸的是,这并不总是你的目标,因此你只有两个选择:

  • 重置流。从JavaDoc:
重置将忽略已写入的任何对象的状态 流动该状态被重置为与新的ObjectOutputStream相同。 流中的当前点标记为重置,以便 相应的ObjectInputStream将在同一点重置。 以前写入流的对象将不会被称为 已经在溪流中了。它们将再次写入流中

你可以读一篇关于这方面的好文章

  • 按照您的建议,创建对话对象的新实例
我个人认为创建新对象比在每次写入之前(或之后)重置流更干净,但是如果您的对象分配相当大,并且在网络写入之间只更改了几个字段,那么重置流可能更好


然而,这种优化可能最好推迟到项目的后期,那时您可以进行一些真正的分析,看看哪个更适合您。我的建议是选择你最喜欢的,然后继续前进,直到你达到了优化的关键点。永远记住,过早优化是优秀编程的祸根!:)

嗨,matthew,谢谢你的回复。是的,我正在使用序列化。最初我让我的代码每次都发送新对象,但我认为这有点浪费,于是将它改为只更新消息状态。比如说,如果我更新的是一个向量而不是一个字符串,这是我最初想要做的,这将如何工作..你看,我想写一个轮询机制,客户端将要求发送到服务器的最新消息(这将由一个字符串向量组成)…我将如何通过网络发送该向量?即,如果我每次创建一个新对象,该向量每次都将重置为一个新向量。。我不希望这样,我希望会话字符串的完整向量从服务器发送回客户端。我不太确定我是否说得足够清楚以理解。我相信我的问题是:如何创建一个新对象,但保持相同的完全填充向量?这可能吗?谢谢我不确定我是否完全理解你的问题。您是否有要发送的对象向量?在这种情况下,我会保留相同的向量,向其中添加项目,然后发送每个对象,而不是整个向量。然后,您可以清除该向量,重新填充它,然后重新迭代它,以发送它可能拥有的任何新对象。快速注意:向量已被实现列表接口的类(LinkedList、ArrayList等)所取代,这些类应在所有新代码中使用。谢谢,是的,我相信这就是我需要的解决方案:)