socket开发流程详述(上)

半个月以前,我在压力山大的改着购物车的bug时,领导给了我新的任务---开发某银行接口和业务实现,当时心里真的是乐坏了,心想终于能够从某项目的大坑中爬出来,去做点新鲜的东西.虽然不如刨出系土的嫩芽儿那么鲜嫩.这是因为我在不久之前做了某银行的业务功能,顺带把它的接口也看了一遍.说到这里就要说说struts2,struts2用起来真的很不适应,页面很乱,很多人不能想象当后台代码与前端语言厮混到一起的时候是什么感受.无法言表.咳咳,还是和之前写博客一样容易扯远,回归正题.

本次银行开发使用的是socket短连接来实现实时通讯.这也是我第一次接触socket.所以需要说明的是本篇博客仅仅是记述我的开发过程,可能有些地方叙述的不恰当甚至是错误的.对于这点,希望大家多多包涵.

一 认真研读接口文档,模拟demo效果

当我拿到接口文档和demo时,整个人处于完全懵逼的状态.不知道如何下手.只能在网上随便拿端代码过来.事实证明,完全行不通!这时候本次开发过程中的一点就体现出来了,认真研读接口文档,模拟demo效果.

所谓磨刀不误砍柴工,准备工作从来都不会阻碍你的前进脚步,反而会使你后来居上.接口文档上的每一点都是我们在开发过程中要万分注意的,稍不注意就会使你的程序运行受阻.这时你可能会花上十几分钟,半个小时甚至是半天的功夫来弥补这个错误.而在这个填坑的过程中,你会被迫的去问与你对接的银行工作人员.你会自然而然的放低你的姿态,因为你需要别人来帮你解决问题.当这种事情多发生几次,在群聊里隐身的领导就会认为你做事不够仔细,能力不够,甚至是态度有问题.这是我在本次开发过程里的亲身体会,你无法去责怪银行工作人员的高姿态,只能怪自己准备的不够充足.

并不是每一份demo都是完美无缺的,比如我的这一份,处处是坑,让我一次次抓狂.但是必须要知道的是demo不仅仅是你需要的代码,还有流程!比如socket的生命周期,你可以很清楚地看到它在何处被创建,如何去使用,在何处被销毁.尽管你对细节知之甚少,但是仅此也非常足够了.

在此我大致说一下银行接口功能开发的一般过程,这些我们可以从接口文档里总结出来:

市场:市场签到与签退------会员信息的管理-------市场出入金(收益,调拨,营销等)-----对账文件下载与入库-----自动对账------清算(生成文件)-----清算文件下载(清算失败与成功)

会员:开户------会员资料维护(修改与变更,注销与解绑)-------会员出入金

此外还需要添加操作日志记录,并提供市场与个人的记录查看功能

这里较难的模块是对账与清算,具体在后面再进行叙述

二 socket的创建

这里我就不去使用自己开发的代码了,涉及到保密的问题.这里有一段我认为比较好的代码,贴给大家,原文链接是:http://www.cnblogs.com/zhoudi/p/6025552.html

客户端创建:


市场作为server接收银行的请求,服务器端创建:


1.这里需要注意的有,IP与端口的区分,可能银行会有两个端口,一个是交易端口,一个是文件传输端口,server端的端口就是我们自己的端口,一般来说只有一个.这里的数据都是从配置文件里读取的,但是一般我们系统为了安全,读取配置文件有一些限制.一般来说我们可以主动获取到他的bean,从而获取到配置文件的config类.最后读取到数据.获取到bean的方法如下:


同样的,service调用也是一样的方法,不主动去获取而是通过注解的方法,你的控制台可能会有一大堆的空指针在向你招手哦~

2.随开随关,一定要记住(包括我们在读写socket的输入输出流).忘记关闭socket带来的后果可不仅仅是控制台报错这么简单.socket关闭的方法如下:



3.如何去准确的读取流,转换成我们需要的xml字符串,我使用的方法是DataInputStream.read().这里需要去定义流的长度.由于我每次获取的报文里都会有标明报文的长度.所以我第一步是获取前8位,通过这8位来获取总长度,然后去获取完整的报文,方法如下:


有一个需要地方需要特别注意的是,即使我们有了准确的报文长度,我们也不一定能够获取到完整的报文,特别是当报文的长度过长时,这是我们的读取方法可以使用DataInputStream.readfully()这个方法.当时这个问题困扰了我整整一天!代码就是如此,可能只是一两句代码,就可以让不可思议的问题迎刃而解,这也是我认为它的魅力所在.

4.xml的解析一般采取dom4j提供的方法去解析,通过获取xml元素来得到对应的value.这里需确定这项数据是不是必传,如果不是,在获取的时候需要添加条件,否则就出出现空指针异常.一般的获取方法如下:


当然,我们有时候为了方便数据处理,会把xml转换成指定的对象.一般我们使用,这里我也不展示我自己的代码了,给大家贴一个样例,原文地址是:http://blog.csdn.net/arjick/article/details/6251777


将map转为对象,可以使用json提供的toJSONString和parseObject方法,具体的方法不贴了.

5.我们在接收银行的请求时,一定要给银行返回我们的接收结果.比如银行给我们发起一笔入金交易.我们在接收到请求后,会进行本地的业务处理,如果业务处理失败了,就不能给银行返回成功或不返回,出现了不返回或返回的情况,会导致会员入金成功却无法到账,就像我们在菜市场买了一棵白菜,钱花了,却没拿到我们的大白菜.给后期的对账和清算加大了难度,而且用户体验也不好.

这篇博客到这里就结束了,后续会继续介绍具体的业务问题,如socket自动开启和文件数据入库等

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值