您好,欢迎访问三七文档
请教如何判断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连接登陆指令连接登陆指令是在客户端成功连接后首先应当而且只能在此时发送的指令:格式:LoginName=【注册名】&Pwd=【注册密码】&Type=【注册类型,0:接收和发送;1:接收;2:发送;默认为0】(回车换行)如果所有服务注册成功,服务器返回给客户端字符串:Pass(回车换行)否则将断开连接。对于一次未连接成功,应至少在20秒以后再重试连接,禁止连续的重试连接。请问红色的话,我应该如何设置三分钟内不收到服务器任何指令将主动断开连接并重新连接.我写的主要的客户端的代码:父类线程:publicclassParentThreadextendsThread{privateSocketsocket;protectedBufferedReaderreader;protectedBufferedWriterwriter;protectedbooleanisConnection=false;protectedbooleanlogin(inttype){LoginRequestlogin=newLoginRequest(type);//login.setRegType(type);login.create();try{writer.write(login.getOrder());writer.flush();Stringstr_order=reader.readLine();System.out.println(str_order);//PassResponsepass=newPassResponse(str_order);//if(pass.isPass()){if(Pass.equals(str_order)){returntrue;}else{returnfalse;}}catch(IOExceptione){e.printStackTrace();}returnfalse;}protectedvoidinit(){try{socket=newSocket(Const.distributeCenterIP,Const.distributeCenterPort);//socket.setSoTimeout(50000);reader=newBufferedReader(newInputStreamReader(socket.getInputStream()));writer=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));isConnection=true;}catch(UnknownHostExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}protectedvoidcloseSocket(){isConnection=false;try{if(reader!=null)reader.close();}catch(IOExceptione){e.printStackTrace();}try{if(writer!=null)writer.close();}catch(IOExceptione){e.printStackTrace();}try{if(socket!=null)socket.close();}catch(IOExceptione){e.printStackTrace();}}}接收短信连接,继承父类线程publicclassSmsReceiverextendsParentThread{privatebooleantoReconnection=false;@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubtry{init();//登陆booleanb=login(Const.reg_type_receive);if(!b){//登陆失败,退出SmsMain.log.error(登陆失败,程序退出!请检查注册名和口令是否正确;SmsMain.log.info(注册名名:+Const.reg_name);SmsMain.log.info(用户口令:+Const.reg_pwd);SmsMain.log.info(注册类型:+Const.reg_type_receive);}}catch(Exceptione){toReconnection=true;}while(true){if(toReconnection){/**20秒连接一次*/try{sleep(20000);init();//登陆booleanb=login(Const.reg_type_receive);toReconnection=false;if(!b){//登陆失败,退出SmsMain.log.error(登陆失败,程序退出!请检查注册名和口令是否正确;SmsMain.log.info(注册名名:+Const.reg_name);SmsMain.log.info(用户口令:+Const.reg_pwd);SmsMain.log.info(注册类型:+Const.reg_type_receive);break;}}catch(InterruptedExceptione){e.printStackTrace();}}if(!isConnection){//连接失败toReconnection=true;continue;}try{Stringstr_order=reader.readLine();System.out.println(str_order);Orderorder=newOrder(str_order);//如果为测试指令,发送回应//if(order.isTestOrder()){if(test.equals(str_order)){System.out.println(---测试----;writer.write(order.testOrder);writer.flush();toReconnection=false;continue;}//处理SMSBusinessCentersbc=newSMSBusinessCenter(order);Propertiesprop=sbc.performTask();//发送回应System.out.println(prop.getProperty(CommandId);received(prop.getProperty(CommandId);}catch(IOExceptione){e.printStackTrace();}}}privatevoidreceived(Stringcid){//Receivedreceived=newReceived(Utils.getCurrentCommandId());//Receivedreceived=newReceived(cid);//received.create();try{writer.write(ReceivedCommandId=+cid+\r\n;writer.flush();}catch(IOExceptione){e.printStackTrace();}}}发送短信连接,继承父类线程:publicclassSmsSendextendsParentThread{privatebooleantoReconnection=false;@Overridepublicvoidrun(){try{init();//登陆booleanb=login(Const.reg_type_send);if(!b){//登陆失败,退出SmsMain.log.error(登陆失败,程序退出!请检查注册名和口令是否正确;SmsMain.log.info(注册名名:+Const.reg_name);SmsMain.log.info(用户口令:+Const.reg_pwd);SmsMain.log.info(注册类型:+Const.reg_type_send);}}catch(Exceptione){toReconnection=true;}while(true){if(toReconnection){/**20秒连接一次*/try{sleep(20000);init();//登陆booleanb=login(Const.reg_type_send);toReconnection=false;if(!b){//登陆失败,退出SmsMain.log.error(登陆失败,程序退出!请检查注册名和口令是否正确;SmsMain.log.info(注册名名:+Const.reg_name);SmsMain.log.info(用户口令:+Const.reg_pwd);SmsMain.log.info(注册类型:+Const.reg_type_send);break;}}catch(InterruptedExceptione){e.printStackTrace();}}if(!isConnection){//连接失败toReconnection=true;continue;}try{Stringstr_order=reader.readLine();Orderorder=newOrder(str_order);//如果为测试指令,发送回应if(order.isTestOrder()){writer.write(order.testOrder);toReconnection=false;//continue;}////处理//SMSBusinessCentersbc=newSMSBusinessCenter(order);//Vectormsgs=sbc.getSendMsg();////发送短信////for(){//writer.write(;//////发送短信if(SmsMain.list!=null&&SmsMain.list.size()0){synchronized(SmsMain.list){for(Iteratoriterator=SmsMain.list.iterator();iterator.hasN
本文标题:如何判断SOCKET通信中,客户端在10s内未发送数据或者未收到服务器发送的数据,自动断开
链接地址:https://www.777doc.com/doc-3572874 .html