client_A->server->client_B实现
如题,client A、B是两类客户端。业务流程是client A提交信息到server,server端根据提交信息初步处理然后提供决策给client B客户端选择,client B把选择结果发送回server,server端根据该结果作进一步处理,并把结果发送回client A~
小弟初学socket编程,感觉c/s架构都是request/response类型的,但类似server->client_B却是服务器的主动推送,这该如何实现?(准备吧client A和Client B端的程序开发成eclipse插件格式)
server
socket
服务器主动推送
------解决方案--------------------在这里看到clientB在业务功能上只扮演了服务端的角色,貌似没有必要定位成客户端。
------解决方案--------------------你的这个问题可以分为两个部分,第一个问题是clientA连接server端并推送信息,server端返回处理结果给clientA;第二个问题是server端连接clientB并推送信息,clientB将处理结果返回给server。其中第一个问题可以在clientA使用socket连接server端的ServerSocket,第二个问题使用server端的socket连接clientB的ServerSocket。在这个过程中,server端有一个角色转换,在第一个问题中可以认为是服务器,而第二个问题被认为是客户端。在整个过程中有一个难点是,server端如何定位clientB。如果clientB有固定的地址就比较好处理了;如果不固定,只能通过在服务器建立客户端注册信息,服务端通过注册信息查找clientB的地址。
------解决方案--------------------
如果clientB要扮演双重角色功能,就按双重角色的标准去实现它,只是往往不可能所有都兼顾。
------解决方案--------------------
假设有三个客户端A,B,C
他们与服务器连接后服务器开辟三条子线程thread_A,thread_B,thread_C分别处理服务器与客户端的通信,
如果客户端A通过thread_A发给服务器一段信息,希望通过服务器把这段信息发给客户端B,服务器如何处理才能调用thread_B线程把信息发给客户端B呢
------解决方案--------------------
刚才想了下 服务器可以保留一个线程集合,每当创建线程时把线程放入集合中,每个线程对象都有特定的标志位,当客户端A向B通信时,服务器遍历集合中的线程对象,找到对应标志位的线程对象,然后调用该线程对象的些方法把客户端A传来的信息输出给客户端B
但是我觉得如果客户端很多时遍历岂不是很耗时,但是想不出别的办法了
------解决方案--------------------
服务器端为每个客户端保留一个线程并不合适,如果客户端太多,服务器资源就会耗尽,只需要在服务器保存每个客户的连接信息,在需要传递信息的时候,启动一个线程连接对应客户端发送信息,完成信息传递后,线程结束或者返还给线程池。
------解决方案--------------------
那服务器只能传udp包了吧 如果客户端是移动设备那就麻烦了 还要监听设备网络状态 更新连接信息 头痛