2017-07-17 70 views
0

已解决:能够比我想象的更早进行测试。原来我的服务器端代码是正确的,而且我并没有经常检查客户端变量的变化。现在完美运作。努力让客户端自动接收服务器的更新

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

我试图只通过flush()的数据通过,只有当我完成读取数据时关闭它,但即使如此,flush()不工作,除非我真的。我的最终目标是通过服务器发送数据,并在发送完成后立即在客户端显示该数据。我只是困惑于我如何不断关闭套接字或流(如果重要,我使用OutputStreamWriter),从服务器向客户端连续发送数据。

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

我现在不能发布我的代码,因为我几个小时都无法访问它。我试过的一些事情是setTcpNoDelay为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() 

编辑:从做一些研究,并在数据未立即使用,因为它是被缓冲送?如果这是对的,有没有办法加快这个过程?(对不起,如果这听起来很蠢)

回答

0

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

0

这是一个基本问题,所以你到目前为止不是唯一的这个问题。基本上,服务器无法启动与客户端的通信。服务器提供来自客户端的请求,并且不能启动通信。在许多情况下,服务器不知道也不关心他将服务多少个客户端。另一方面,同步通信意味着请求响应周期应该很短,即,即,您不希望长时间或无限期地打开请求连接。因此,如何让服务器开始与客户交谈有很多不同的方法。

  • 最简单的就是“轮询”,即客户端用预定义的时间段(即每10秒,3小时或任何适合您的需求)向服务器发送请求。这是一个简单的解决方案,在很多情况下是不够的,但在某些情况下,它已经足够了
  • 另一种选择是同步通信,客户端发送初始请求,服务器发送确认,即它表示我已收到您的请求并将返回当我有答案的时候给你。客户端然后将开始侦听预定义的队列。然后服务器一旦有答案就会在队列中发布答案,客户端将使用它。

这两个是最常见的解决方案,但不是唯一的解决方案。

相关问题