公司让我调试CRM的开户接口,具体来说,是在平台组成相应的参数,通过将平台的数据包转换成CRM能够识别的包格式,最后再通过一个独立的socket模块将CRM包传送出去。ps:socket模块位于平台和CRM之间,与平台及CRM均通过socket建立连接。
说老实话,代码并不难,无非就是组包,解包,写数据库之类的操作。
难就难在数据库配置这块上面!
当我按照协议要求,将平台转CRM包在数据库配置后,socket模块总是报异常。。
仔细检查了数据库的配置,好像配置是正确的,跟踪打印信息,数据包确认已经送达了socket模块。
提示线程出错。
反复折腾了好几天,由于又要接手新的项目,所以我始终没有认真去想为什么会报异常。
今天再摸了一下,我减少了一些数据库的配置,奇怪,可以了,恢复到原样,又报这个异常。
这一下我理解了,肯定是socket模块的接收缓冲区溢出。
由于socket模块已经是别人写的代码,我拿过来看了一下,发现socket模块是采用多线程方式,每接收到一个新的连接,就开辟一个新的线程负责处理这个连接请求,而这个线程开辟的接受缓冲区只有10000个字节,不足以容纳我发送的数据,导致缓冲区溢出。
将缓冲区扩大一下,正常。。
想起了我以前也碰到了一个这样的问题。。
经验:
在这种情况下,我确信数据已经发送到了socket模块,那么此时出错只有两种情况:1、数据库的配置出错 2、socket模块接收有问题。
首先先找自身问题:1、仔细查找数据库的配置情况 。 2、在手工基本上无法找出原因后,缩小范围,具体来说是将一些配置置为无效,查找是否还会出现异常。反复操作,基本上可以定位出错位置 3、如果仍然无法定位,可以查找是否是因为一些空格符,回车符的原因。 4、最后在排除所有的配置出错情况后,就要怀疑是对方模块出现了问题,导致接收异常。
在和别人联调时,不要出现问题首先认为是对方的问题,出现问题时,应该仔细想想自己有可能有哪些问题,应该多和对方沟通,共同分析出错误的原因。