还剩14页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
请教如何判断SOCKET长连接通信中,一段时间内是否收到对方的信息.及相关问题.对方的接口文档中要求:
1.2业务接口服务端地址
211.
151.
234.131端口号9007Tcp协议适合发送量大,发送和接收比较及时,对于Tcp客户端由于某些原因一段时间内不能连接到分发中心服务器,所有的发向该客户端的MO短信和报告都会被缓存起来,等该客户端一旦连接,便会很快补发建议合作方建立一个发送一个接收2个连接,如果业务量很大,可以申请多于2个的连接,但须向业务申请后方可加连接,系统对于连接数是有限制的,每个合作方没有特殊声明时连接数是3,一般可以建2个连接,一个连接用于缓冲在某些情况下断开不能很好识别的情况还有,对于每条连接,我们目前的速度限制是10条/秒,如果你的业务超过每连接每秒10条的限制,可以向业务申请调高每条连接的最高限速服务器端要求每连接每分钟都要能从客户端接收到至少一条指令数据,如果超过一分钟没有收到,服务器会向客户端发送一个测试指令,只要合作方回应该指令,那么就认为连接是处于激活状态,如果3分钟内服务端都无法接收到客户端的测试回应,将主动断开连接客户端程序也应该设置3分钟内不能收到服务器端任何指令将主动断开连接并重新连接为了防止分发中心连接负载太重,我们要求任何一个连接因任何原因在断开后20秒内不得连接,20秒后再尝试连接,否则如果在1分钟内超过我们设定的连接次数,我们将限制其在后续10分钟之内不能连接,并向系统管理员告警,由系统管理员根据情况停止该用户的合作帐户
1.
2.1连接登陆指令连接登陆指令是在客户端成功连接后首先应当而且只能在此时发送的指令格式Login Name=【注册名】Pwd=【注册密码】Type=【注册类型,0接收和发送;1接收;2发送;默认为0】(回车换行)iftoReconnection{/**20秒连接一次*/trysleep20000;init;〃登陆boolean b=loginConst.reg_type_send;toReconnection=false;if!b{〃登陆失败,退出SmsMain.log.error“登陆失败,程序退出!请检查注册名和口令是否正确;SmsMain.log.info注册名名:H+Const.reg_name;,用户口令:“+Const.reg_pwd;SmsMain.log.info注册类型:“+Const.reg_type_send;break;}catch InterruptedExceptione{e.printStackTrace;}H!isConnection{〃连接失败toReconnection=true;continue;String str_order=reader.readLine;Order order=new Orderstr_order;try//如果为测试指令,发送回应iforder.isTestOrder{writer.writeorder.testOrder;toReconnection=false;//continue;〃处理SMSBusinessCenter sbc=new//Vector msgs=sbc.getSendMsg;//〃发送短信SMSBusinessCenterorder;////for{//writer.writeHH;//////〃发送短信//ifSmsMain.list!=nullSmsMain.list.sizeO{synchronizedSmsMain.list{for Iteratoriterator=SmsMain.list.iterator;iterator.hasNext{SubmitRequest sr=SubmitRequest iterator.next;StringBuffer sb=new StringBuffer;sb.appendConst.order_submit+H H.appendHCommandld=H+sr.getCommandld.appendGateWay=H+sr.getGateWay.appendHGateName=H+sr.getGateName.appendnltemld=,,+sr.getltemld.appendHSpNumber=H+sr.getSpNumber.appendHUserNumber:=+bin2hexsr.getUserNumber.appendnUserNumberType=H+sr.getUserNumberType.appendHFeeNumber=H+sr.getFeeNumber.appendnFeeNumberType=H+sr.getFeeNumberType.appendHFeeType=H+sr.getFeeType.appendHScheduleTime=H+sr.getScheduleTime.appendHExpireTime=H+sr.getExpireTime.appendMtFlag=H+sr.getl\/ltFlag.appendReportFlag=H+sr.getReportFlag.append,,MsgCode=H+sr.getMsgCode.appendHMsgld=H+sr.getMsgld.appendExtData:=n+sr.getExtData.append,,TP_pld=,1+sr.getTp_pld.appendnTP_udhi=n+sr.getTp_udhi.appendHMsg:=H+bin2hexsr.getMsg.appendHLinklD=H+sr.getLinklD.appendHltemType=,,+sr.getltemType+H\r\nn;writer.writesb.toString;writer.flush;SmsMain.list.removesr;〃接受回应received;}catch lOExceptione{e.printStackTrace;private voidreceived{try Stringline=reader.readLine;//Received received=new Receivedline;//received.parse;System.out.printlnline;SmsMain.log.infoline;}catch lOExceptione{e.printStackTrace;*字符串转换成十六进制值*@param binString转换成十六进制的字符串*@return*/public staticString bin2hexString bin{char[]digital=H0123456789ABCDEFH.toCharArray;StringBuffer sb=new StringBuffernn;byte[]bs=bin.getBytes;int bit;for inti=0;ibs.length;i++{bit=bsOxOfO»4;sb.appenddigital[bit];bit=bsOxOf;sb.appenddigital[bit];return sb.toString;语言:c#问题:在socket通信时,怎么样判断socket双方是否断开连接我在Server端new了一个socket,然后bind,开了一个线程来accept前来连接的client,每接到一个client前来连接就新开一个线程和它进行通信我把Server端得到的socket放到一个集合里,我想知道集合里的socket是否断开连接,如果断开连接我就把它从这个集合里移除判断socket是否断开连接,网上有N种说法这个属性只能说明上一次通信时还是正常的这个方法是可以,但是它要从socket里读或写部分数据,如果其他线程从这个socket读写数据,那么数据将会出错我在写一个远程通信软件时候就出现这个问题了而且上这样说的此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭您必须尝试发送或接收数据以检测这些类型的错误
3.使用心跳包每隔一段时间,socket一方向另一方发送一段特殊的数据,socket的另一方接到这个数据后回发回来这样就能判断socket两方都没有掉线了如果所有服务注册成功,服务器返回给客户端字符串:Pass(回车换行)否则将断开连接对于一次未连接成功,应至少在20秒以后再重试连接,禁止连续的重试连接请问红色的话,我应该如何设置三分钟内不收到服务器任何指令将主动断开连接并重新连接.我写的主要的客户端的代码父类线程public classParentThread extendsThread{private Socketsocket;protected BufferedReaderreader;protected BufferedWriterwriter;protected booleanisConnection=false;protected booleanloginint type{LoginRequest login=new LoginRequesttype;//login.setRegTypetype;login.create;try writer.writelogin.getOrder;writer.flush;String str_order=reader.readLine;System.out.printlnstr_order;//PassResponse pass=newPassResponsestr_order;//ifpass.isPass{ifTassn.equalsstr_order{return true;}else{return false;}catch lOExceptione{e.printStackTrace;return false;protected voidinit{try socket=newSocketConst.distributeCenterlP Const.distributeCenterPort;5//socket.setSoTimeout50000;reader=new BufferedReadernewlnputStreamReadersocket.getlnputStream;writer=new BufferedWriternewOutputStreamWritersocket.getOutputStream;isConnection=true;}catch UnknownHostExceptione{//TODO Auto-generated catchblocke.printStackTrace;}catch lOExceptione{//TODO Auto-generated catchblocke.printStackTrace;protected voidcloseSocket{isConnection=false;try{ifreader!=nullreader.close;}catch lOExceptione{e.printStackTrace;}try ifwriter!=nullwriter.close;}catch lOExceptione{e.printStackTrace;try{ifsocket!=nullsocket.close;}catch lOExceptione{e.printStackTrace;接收短信连接,继承父类线程public classSmsReceiver extendsParentThread{private booleantoReconnection=false;©Overridepublic voidrun{//TODO Auto-generated methodstubtryinit;//登陆boolean b=loginConst.reg_type_receive;if!b{〃登陆失败,退出登陆失败,程序退出!请检查注册名和口令是否正确”;SmsMain.log.info,注册名名:H+Const.reg_name;用户口令:“+Const.reg_pwd;SmsMain」og.info注册类^:n+Const.reg_type_receive;}catchException e{toReconnection=true;whiletrue{iftoReconnection{/**20秒连接一次*/trysleep20000;init;〃登陆boolean b=loginConst.reg_type_receive;toReconnection=false;4!b{〃登陆失败,退出SmsMain.log.eiror登陆失败,程序退出!请检查注册名和口令是否正确;注册名名:+Const.reg_name;SmsMain.log.info用户口令:H+Const.reg_pwd;SmsMain.log.info注册类型:”+Const.reg_type」eceive;break;}catch InterruptedExceptione{e.printStackTrace;if!isConnection{〃连接失败toReconnection=true;continue;try Stringstr_order=reader.readLine;System.out.printlnstr_order;Order order=new Orderstr_order;//如果为测试指令,发送回应//iforder.isTestOrder{ifHtestH.equalsstr_order{System,out.printing---测试一」;writer.writeorder.testOrder;writer.flush;toReconnection=false;continue;//处理SMSBusinessCenter sbc=newSMSBusinessCenterorder;Propertiesprop=sbc.performT ask;〃发送回应System.out.printlnprop.getPropertyHCommandldn;receivedprop.getPropertynCommandldn;}catch lOExceptione{e.printStackTrace;private voidreceivedString cid{//Received received=newReceivedUtils.getCurrentCommandld;//Received received=new Receivedcid;//received.create;try writer.writeHReceived Commandld=H+cid+n\r\nH;writer.flush;}catch lOExceptione{e.printStackTrace;发送短信连接,继承父类线程:public classSmsSend extendsParentThread{private booleantoReconnection=false;@Overridepublic voidrun{tryinit;//登陆boolean b=loginConst.reg_type_send;if!b{〃登陆失败,退出,登陆失败,程序退出!请检查注册名和口令是否正确”;注册名名:H+Const.reg_name;SmsMain」og.info用户口令:“+Const.reg_pwd;SmsMain.log.info注册类型:H+Const.reg_type_send;}catchException e{toReconnection=true;whiletrue{。