也问socket
龙四 2010-05-25 10:15:47 要搞一个基于socket的的远程方法调用(RMI,WEBSERVICE,HTTP都很容易做到,这里不提)。
涉及到的问题:
1、可能会处于高压力状况,所以在客户端需要保持socket连接。而不是每调用一个方法重连一次
2、既然是在我的电脑上调你电脑上jvm上的方法,肯定涉及参数传递和结果(包括异常信息)返回
本人想法如下:
封装一个客户端,new客户端的时候连接ServerSocket,然后一直保持该连接,直到调用客户端封装的close方法才断开连接。方法的参数和返回结果肯定都是可以序列化的,我可以建一个类,包括需要调用的方法名,方法参数的Class[]和参数数组,传到客户端后通过反射调用服务器中的方法,得到结果后,再封装到一个类中,如是否调用成功,调用的返回值和异常,这就涉及一个问题,TCP/IP是保证顺序的,单线程没有问题,但是如果客户端多线程调用方法,服务器端接受调用请求可以无先后顺序,但接收端也没有返回值的先后顺序了。如此一来,此法不通,需要自定义应用报文,可能形如以下格式
开始标志(固定字节)|方法标志(是哪个方法调用的,由调用的时候临时生成,确保唯一,传到服务器,再传回来,固定字节)|报文总长度(固定字节)|报文内容(可变长度)|结束标志(固定字节)
然后在客户端起一个独立的线程专门接收和解析服务器的这个报文,并将解析后的对象存放到客户端的一个Map属性(key为方法标志,value为调用结果),然后某个客户端方法发送调用请求后不断遍历该Map,直到找到调用结果或某种条件(如超过多长时间仍然没有找到)结束。
不知道各位牛人们有什么建议抑或有更好的想法?