要搞一个基于socket的的远程方法调用(RMI,WEBSERVICE,HTTP都很容易做到,这里不提)。涉及到的问题:1、可能会处于高压力状况,所以在客户端需要保持socket连接。而不是每调用一个方法重连一次2、既然是在我的电脑上调你电脑上jvm上的方法,肯定涉及参数传递和结果(包括异常信息)返回
本人想法如下:封装一个客户端,new客户端的时候连接ServerSocket,然后一直保持该连接,直到调用客户端封装的close方法才断开连接。方法的参数和返回结果肯定都是可以序列化的,我可以建一个类,包括需要调用的方法名,方法参数的Class[]和参数数组,传到客户端后通过反射调用服务器中的方法,得到结果后,再封装到一个类中,如是否调用成功,调用的返回值和异常,这就涉及一个问题,TCP/IP是保证顺序的,单线程没有问题,但是如果客户端多线程调用方法,服务器端接受调用请求可以无先后顺序,但接收端也没有返回值的先后顺序了。如此一来,此法不通,需要自定义应用报文,可能形如以下格式开始标志(固定字节)|方法标志(是哪个方法调用的,由调用的时候临时生成,确保唯一,传到服务器,再传回来,固定字节)|报文总长度(固定字节)|报文内容(可变长度)|结束标志(固定字节)
然后在客户端起一个独立的线程专门接收和解析服务器的这个报文,并将解析后的对象存放到客户端的一个Map属性(key为方法标志,value为调用结果),然后某个客户端方法发送调用请求后不断遍历该Map,直到找到调用结果或某种条件(如超过多长时间仍然没有找到)结束。不知道各位牛人们有什么建议抑或有更好的想法?
本人想法如下:封装一个客户端,new客户端的时候连接ServerSocket,然后一直保持该连接,直到调用客户端封装的close方法才断开连接。方法的参数和返回结果肯定都是可以序列化的,我可以建一个类,包括需要调用的方法名,方法参数的Class[]和参数数组,传到客户端后通过反射调用服务器中的方法,得到结果后,再封装到一个类中,如是否调用成功,调用的返回值和异常,这就涉及一个问题,TCP/IP是保证顺序的,单线程没有问题,但是如果客户端多线程调用方法,服务器端接受调用请求可以无先后顺序,但接收端也没有返回值的先后顺序了。如此一来,此法不通,需要自定义应用报文,可能形如以下格式开始标志(固定字节)|方法标志(是哪个方法调用的,由调用的时候临时生成,确保唯一,传到服务器,再传回来,固定字节)|报文总长度(固定字节)|报文内容(可变长度)|结束标志(固定字节)
然后在客户端起一个独立的线程专门接收和解析服务器的这个报文,并将解析后的对象存放到客户端的一个Map属性(key为方法标志,value为调用结果),然后某个客户端方法发送调用请求后不断遍历该Map,直到找到调用结果或某种条件(如超过多长时间仍然没有找到)结束。不知道各位牛人们有什么建议抑或有更好的想法?
2).在自定义报文中,你可以添加源地址、目的地址、服务器地址的信息。服务端和客户端基于此三个地址按照一定规则(由你制定)进行数据交互即可!
2.楼主的需求是否到了必须自己来完成server端开发的地步。server端考虑的问题多,不仅仅是楼主考虑的这些了。楼主还要考虑是采用nio模式或者阻塞模式,考虑心跳监控连接有效...,机器负载问题,大负载处理问题。对于两个问题我会选择的做法。
1.非自定义协议尽量使用文本协议,测试和开发难度都会减少。最好能基于server服务的通讯协议进行扩展。
2.使用现存的server端,例如:mina(nio实现),或者你自己直接使用(nio、http、...)注册请求,搭建线程池,提供任务处理器...,这样比自己纯写socket要稳定的多。开发量也会很多。负载问题策略处理还是需要自己来。不知道你的server是否存在分布式设计。
数据完整性是首要的
首先感谢关注!这个已经是必须的了2.楼主的需求是否到了必须自己来完成server端开发的地步。server端考虑的问题多,不仅仅是楼主考虑的这些了。楼主还要考虑是采用nio模式或者阻塞模式,考虑心跳监控连接有效...,机器负载问题,大负载处理问题。
服务器端的服务已经是现成的,只需要加上socket协议进行处理
机器没问题,基本会是8C16G或者更好,还可做集群服务器端还有什么其他方面的注意事项吗?真项目不敢大意,动手之前尽量考虑周全。不知道阁下是否有demo或者伪代码之类的可以拿来观摩观摩?
文本协议是协议层面的问题,安全是安全方面的。如果楼主考虑安全的话,还需要提供一个安全的层,如果是安全度比较高的加解密,消息更严谨点是要考虑使用byte来做,设定安全消息的加密方式,消息体长度。
但如果仅仅是base64就完全没有必要了(base64最好使用乱序后的key)。
这个要看安全的需求了。你是服务如果不太怕别人抓就无所谓了。考虑稳定可能更重要。加解密挺耗cpu的。特别CBC模式加解密。
如果做集群,是需要有一个任务注册服务的,真正的任务处理应该在不同的机器上。
任务处理服务具备以下能力:
1.不论监听的port有几个,统一把请求发送到注册服务server。
2.服务心跳监察,确认服务的机正常。
3.考虑每个任务处理进程中的任务队列的饱和度。(负载的考虑,每太机器的饱和度和机器自身性能有关,自己设定标准)。
4.当所有的任务机器都任务饱和的情况下,需要对请求进行通知,告知服务忙请重试。
已经发送任务机,也需要告知请求者正在处理。