苦苦于让客户自动接收服务器的更新

时间:2017-07-17 18:29:15

标签: java

解决:能够比我想象的更早地测试它。结果我的服务器端代码是正确的,我不经常检查客户端变量的变化。现在工作得很好。

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

我尝试只通过func detectFaces(image: UIImage) { let detectFaceRequest = VNDetectFaceRectanglesRequest { (request, error) in if let results = request.results as? [VNFaceObservation] { for faceObservation in results { let boundingRect = faceObservation.boundingBox let transform = CGAffineTransform(scaleX: 1, y: -1).translatedBy(x: 0, y: -self.mainImageView.frame.size.height) let translate = CGAffineTransform.identity.scaledBy(x: self.mainImageView.frame.size.width, y: self.mainImageView.frame.size.height) let facebounds = boundingRect.applying(translate).applying(transform) let mask = CAShapeLayer() var maskLayer = [CAShapeLayer]() mask.frame = facebounds mask.backgroundColor = UIColor.yellow.cgColor mask.cornerRadius = 10 mask.opacity = 0.3 mask.borderColor = UIColor.yellow.cgColor mask.borderWidth = 2.0 maskLayer.append(mask) self.mainImageView.layer.insertSublayer(mask, at: 1) } } let vnImage = VNImageRequestHandler(cgImage: image.cgImage!, options: [:]) try? vnImage.perform([detectFaceRequest]) } 数据,只有在我读完数据时关闭它,但即使我flush()除非我实际上没有工作。我的最终目标是通过服务器发送数据,并在我发送数据后立即在客户端显示数据。我只是对如何在不关闭套接字或流的情况下连续从服务器向客户端发送数据感到困惑(如果重要的话,我使用OutputStreamWriter)。

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

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

服务器:

flush()

客户端:

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()

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

这两种解决方案是最常见的解决方案,但不仅仅是解决方案。