Java 努力使客户端自动接收服务器';s更新

Java 努力使客户端自动接收服务器';s更新,java,Java,解决方案:能够比我想象的更早地测试出来。结果证明我的服务器端代码是正确的,我没有经常检查客户端变量的变化。现在效果很好 我正在进行一个辅助项目,在这个项目中,我使用服务器与客户机进行通信。每当java服务器向android客户端发送更新时,它都会在第一次运行时工作。之后,客户端不会注册服务器的消息,因为当它在第一次运行时,我已经关闭了套接字,所以我尝试了另一种方法 我试着通过flush()读取数据,并且只在读取完数据后才将其关闭,但即使使用flush()也无法工作,除非我真的这样做了。我的最终目

解决方案:能够比我想象的更早地测试出来。结果证明我的服务器端代码是正确的,我没有经常检查客户端变量的变化。现在效果很好

我正在进行一个辅助项目,在这个项目中,我使用服务器与客户机进行通信。每当java服务器向android客户端发送更新时,它都会在第一次运行时工作。之后,客户端不会注册服务器的消息,因为当它在第一次运行时,我已经关闭了套接字,所以我尝试了另一种方法

我试着通过
flush()
读取数据,并且只在读取完数据后才将其关闭,但即使使用
flush()
也无法工作,除非我真的这样做了。我的最终目标是通过服务器发送数据,并在发送数据后立即在客户端显示数据。我只是对如何在不关闭套接字或流的情况下连续地将数据从服务器发送到客户端感到困惑(如果有必要的话,我正在使用OutputStreamWriter)

编辑:我忘了提到,但我确实意识到flush()确实会将数据发送到客户端,它只是在我关闭流之前不会更新客户端UI上的数据。我正试图让它自动更新

我现在不能发布我的代码,因为我将在几个小时内无法访问它。我尝试过的一些方法是将tcpnodelay设置为true,并通过字节流发送和接收它,但这不起作用。下面是一些伪代码,可以让您了解客户端和服务器的外观

服务器:

Open the server socket and make the client socket accept the server socket

While the user doesnt quit... 
     Enter a value to send to the client and
     try
        sendData(). After that,
close the outputstreamwriter

sendData(String data) - 
     Declare an outputstreamwriter(Calling it out)
     out.write(data)
     out.flush()
客户:

BufferedReader takes an InputStreamReader parameter and gets the socket's inputStream

While the bufferedReader hasNext
     String message = bufferedReader's input then 
     Display the data

bufferedReader.close()

编辑:通过一些研究,数据是否因为被缓冲而不能立即发送?如果这是正确的,有没有办法加快这个过程?(如果听起来很愚蠢,很抱歉)

我认为更好的选择是以相反的方式实现协议。也就是说,让客户端在计时器任务中查询服务器的更新,而不是从服务器推送更新。

这是一个基本问题,因此您在这个问题上还不是唯一的。服务器基本上无法启动与客户端的通信。服务器为来自客户端的请求提供服务,无法启动通信。在许多情况下,服务器不知道也不关心他将服务多少个客户机。另一方面,同步通信意味着请求响应周期应该很短,也就是说,您不想让请求连接长时间或无限期地打开。因此,有许多不同的方法可以让服务器开始与客户机对话

  • 最简单的一种是“轮询”,即客户机以预定义的时间周期(即每10秒、3小时或任何适合您需要的时间)向服务器发送请求。这是一个过于简单的解决方案,在许多情况下还不够,但在某些情况下已经足够了
  • 另一个选项是同步通信,其中客户端发送初始请求,服务器发送确认,即它表示我收到了您的请求,并将在我得到答案时返回给您。然后,客户端将开始侦听预定义的队列。服务器得到答案后,将在队列中发布答案,客户端将使用该答案
这两个是最常见的解决方案,但不是唯一的解决方案