线上服务器和本地服务器一个TCP通信及本地服务器对接硬件一个TCP备忘

  • 本地服务器和云服务器的tcp通道,云上启动一个线程,while read循环阻塞监听本地服务器的返回内容,当有http的请求时候,加锁防止多个http请求同时发送请求数据导致数据错误,同时让while read阻塞线程唤醒并退出while
  • 然后http请求线程去发送请求,然后read阻塞到返回结果,这时还要判断返回的内容是http请求的返回结果还是本地服务器主动发送的请求,然后释放锁,恢复while read线程阻塞读取socket,用于接收本地服务器的主动tcp请求
  • 让http主动请求占用read通道,while线程唤醒退出,而不是while read 读取内容判断是http请求的结果,来唤醒阻塞的http线程
  • http 是主动请求,只有请求时才有response对象,单独线程启动的while read线程是不能知道将来的http请求会是哪个response对象,也无法通知它,所以只有http请求主动去占用socket并阻塞直到有返回结果
  • 摄像头sdk可以把车辆离开返回的结果和手动拍照两个方向的请求共用一个socket是因为,以现实中的逻辑情况为基础,一个摄像头的tcp不会在车辆离开的返回结果时,又去主动拍照发送请求等待返回结果,如果是同时发生也会出错的,默认不会发生,这样就可以两个方向的请求共用一个tcp
  • 摄像头sdk主动请求比如拍照,发送请求,阻塞等待返回结果,而对于摄像头识别车辆离开反向推送,是用的回调函数,猜测是while read一直阻塞,当主动发送拍照请求时,唤醒while 退出,让拍照请求去read并阻塞直到返回结果,然后再恢复另一个线程while read阻塞,有车辆离开的反向推送时,read数据唤醒,并调用回调函数的对象,如匿名内部类,和1的过程类似
  • 也可能是单独的while read 线程一直阻塞,当拍照主动请求时,传递请求对象,当read到结果后,调用这个对象,当车辆离开反向推送时,read 到结果调用回调函数,回调函数-匿名内部类的listener形式;和上面的不同是,始终进行while read阻塞,根据返回内容来判断是主动请求返回结果还是反向推送的内容
  • 硬件对接接口,因为网页用websocket,不是http,发送请求硬件后,异步返回结果可以去找到对应websocket对象去返回结果,和http不同,http只在每个单独线程请求时能获取response对象,如果启动while read阻塞读取,这时读取到http请求的结果时无法找到http的请求线程的response通知
  • 而岗亭端是websocket可以在任何时候找到这个连接并返回内容,是一种可以异步,有状态标识的连接,http则是一种无状态的没有标识客户端的连接,只能同步返回,异步的结果是找不到这个没有标识的http请求线程response连接的
  • 所以岗亭端的硬件对接可以使用一个tcp通道,发送请求加锁,请求不需要占用通道read阻塞同步直到返回结果,而只需要while read一个单独线程,返回结果直接判断找到websocket的对应连接并返回
  • 参考下自己博客中http调用异步返回的文章
  • 因为对接第三方是一个tcp负责所有摄像头的通信,异步返回是另一个线程调用回调函数,多个摄像头的回调可能会造成多线程发送tcp的返回结果所以要加锁,如果直接调用sdk每个摄像头的异步返回回调结果,直接找到对应websocket返回,每个摄像头都是单独调用回调函数,直接在tomcat中完成调用,不需要再共用一个tcp通信所以不需要加锁

相关内容推荐