有关调用正在运行中的线程的自定义任务的方法的需求

RUA好多鱼~ 2018-07-23 04:24:44
我正在做一个web网站,已有一部分功能是:我的web网站作为socket服务端,监听来自车载终端的通讯链接,可能同时会接收到多个车辆,所以每个socket都是一个线程,socket链接建立后车载终端会每隔10s向我发送一些报文数据,以及心跳数据(通过这个心跳我会维持socket链接不断开)。现在有这样一个新的需求,要求在socket维持连接期间,我的网站可以通过现有的socket链接主动发送一些报文给指定的车载终端,这里我就不知道该怎么去做了,我在页面上发起请求给我的后台,然后如何才能调用正在运行的线程去执行新的逻辑呢,就是调用正在运行的线程,基于他已有的socket连接和客户端进行一些新的交互
...全文
133 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
RUA好多鱼~ 2018-07-23
  • 打赏
  • 举报
回复
引用 5 楼 tianfang 的回复:
“每个socket都是一个线程” 这个是BIO的做法,会导致你的服务器只能支持几千个连接,建议你使用NIO 异步IO开发。更方便的是,使用成熟的软件xmpp服务器来做,车辆是xmpp客户端,xmpp服务器比较差的openfire(连接性能差,但是后台成熟,插件众多)也轻轻松松支持几万个客户端连接。

web服务器向车辆发消息,只要向xmpp服务器发出消息即可,web服务器上可以是xmpp的特殊用户也可以服务模块,xmpp服务器将自动向车辆客户端发出消息。移动场景可以单独写插件,收到车辆客户端消息再发出消息,避免客户端短时不在线接收不到消息。


嗯嗯,我正在学习nio开发,xmpp我还真不知道,感谢大神指点!!!!!!!!!!
RUA好多鱼~ 2018-07-23
  • 打赏
  • 举报
回复
引用 6 楼 stacksoverflow 的回复:
1.对,管他在哪,拿到了去用就可以了。
2.不同的业务都建立inputStream和outputStream的话肯定会有影响,一般来说,和终端建立连接后,inputStream和outputStream就已经建立好了,然后直接拿到inputStream和outputStream去收消息和发消息,比如你把map里直接存outputstream,或者封装到一个类里。



感谢感谢,感谢大神解惑!!!!!!!!!!!!
stacksoverflow 2018-07-23
  • 打赏
  • 举报
回复
1.对,管他在哪,拿到了去用就可以了。
2.不同的业务都建立inputStream和outputStream的话肯定会有影响,一般来说,和终端建立连接后,inputStream和outputStream就已经建立好了,然后直接拿到inputStream和outputStream去收消息和发消息,比如你把map里直接存outputstream,或者封装到一个类里。
tianfang 2018-07-23
  • 打赏
  • 举报
回复
“每个socket都是一个线程” 这个是BIO的做法,会导致你的服务器只能支持几千个连接,建议你使用NIO 异步IO开发。更方便的是,使用成熟的软件xmpp服务器来做,车辆是xmpp客户端,xmpp服务器比较差的openfire(连接性能差,但是后台成熟,插件众多)也轻轻松松支持几万个客户端连接。

web服务器向车辆发消息,只要向xmpp服务器发出消息即可,web服务器上可以是xmpp的特殊用户也可以服务模块,xmpp服务器将自动向车辆客户端发出消息。移动场景可以单独写插件,收到车辆客户端消息再发出消息,避免客户端短时不在线接收不到消息。
RUA好多鱼~ 2018-07-23
  • 打赏
  • 举报
回复
引用 3 楼 stacksoverflow 的回复:
[quote=引用 2 楼 shw717383130 的回复:]
[quote=引用 1 楼 stacksoverflow 的回复:]
socket.getInputStream来接收数据
socket.getOutputStream来发送数据

你只要把每辆车的唯一标识和与其建立的socket做一个Map就可以了。


我大致明白你的意思了,就是 在原本的建立socket连接的那个controller的方法中加一些逻辑,在建立socket的时候,将socket存到map里,和标识对应起来,然后我在需要主动和客户端交互数据的时候(也就是另外一个业务方法),从map中取出来就可以直接用这个socket了对么?[/quote]
对,具体怎么存根据你的义务来。[/quote]

哦哦,我有两个疑问,我的web网站在启动之后就会监听来自客户端的socket连接,每收到一个socket请求就会起一个线程建立连接,那么:
1.按照您说的这个思路,我这个新需求,也就是同时主动和多个客户端通过原有socket进行交互,其实和原本的每一个socket所在的线程没什么关系对吧? 因为之前一直陷在 线程已经启动了没办法调用自定义任务的方法 这个坑里,就一直没想到直接去调用socket
2.我原有的socket连接由于业务原因有可能是正在通过inputStream或outputStream与客户端通信的,那么我在这个新的方法中,从map里取出socket,再去调用getInputStream和getOutputStream获取输入输出流进行数据交互,不会影响到原有的方法的数据交互么
stacksoverflow 2018-07-23
  • 打赏
  • 举报
回复
引用 2 楼 shw717383130 的回复:
[quote=引用 1 楼 stacksoverflow 的回复:]
socket.getInputStream来接收数据
socket.getOutputStream来发送数据

你只要把每辆车的唯一标识和与其建立的socket做一个Map就可以了。


我大致明白你的意思了,就是 在原本的建立socket连接的那个controller的方法中加一些逻辑,在建立socket的时候,将socket存到map里,和标识对应起来,然后我在需要主动和客户端交互数据的时候(也就是另外一个业务方法),从map中取出来就可以直接用这个socket了对么?[/quote]
对,具体怎么存根据你的义务来。
RUA好多鱼~ 2018-07-23
  • 打赏
  • 举报
回复
引用 1 楼 stacksoverflow 的回复:
socket.getInputStream来接收数据
socket.getOutputStream来发送数据

你只要把每辆车的唯一标识和与其建立的socket做一个Map就可以了。


我大致明白你的意思了,就是 在原本的建立socket连接的那个controller的方法中加一些逻辑,在建立socket的时候,将socket存到map里,和标识对应起来,然后我在需要主动和客户端交互数据的时候(也就是另外一个业务方法),从map中取出来就可以直接用这个socket了对么?
stacksoverflow 2018-07-23
  • 打赏
  • 举报
回复
socket.getInputStream来接收数据
socket.getOutputStream来发送数据

你只要把每辆车的唯一标识和与其建立的socket做一个Map就可以了。

81,087

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧