SOCKET通讯及异常问题(高手请进入)

bihongbing 2004-04-09 09:56:37
大家好,我目前在做一个SMS接入模块,要求该模块能接入短信网关(中国移动,中国联通)的短信网关,由于用户发短信的不确定性及通讯可能存在的问题,因此要求在对方:1在对方SOCKET出现异常的情况下,另一端能抛出异常,并重新启动.2:在没有人手工干预的情况下,系统能及时恢复通讯异常. 我现在采用的是TCP长连接,只有在出现异常的情况下才关闭SOCKET,且我的接收和发送是分开的,采用不同的通道.这样和短信中心建立的是互为客户,服务端.下面是我的读流的程序片段,该片段对我的客户,服务端的读操作都一样.
//接收来自短信网关的消息。
public PMessage read()
throws IOException
{
** if(in.available() <=0)//在没有数据可度的情况
** return null;
int total_Length = in.readInt();
if(total_Length<=0)
return null;
int command_Id = in.readInt();
byte buf[] = new byte[total_Length];
in.readFully(buf,8,buf.length-8);
TypeConvert.int2byte(total_Length,buf,0);
TypeConvert.int2byte(command_Id,buf,4);

if(command_Id == SGIPConstant.Sgip_Bind_Resp_Command_Id )//bind消息的应答
{
TraceFactory.getTrace().trace("Sgip_Bind_Resp_Command_Id",Trace.ERROR);
return new SGIPBindRespMessage(buf);
}

if(command_Id == SGIPConstant.Sgip_Bind_Command_Id )//bind消息
{
TraceFactory.getTrace().trace("Sgip_Bind_Command_Id",Trace.ERROR);
return new SGIPBindMessage(buf);
}

if(command_Id == SGIPConstant.Sgip_Deliver_Command_Id )//deliver消息
{
TraceFactory.getTrace().trace("Sgip_Deliver_Command_Id",Trace.ERROR);
return new SGIPDeliverMessage(buf);
}

if(command_Id == SGIPConstant.Sgip_Submit_Resp_Command_Id )//submit_Rep 消息
{
TraceFactory.getTrace().trace("Sgip_Submit_Resp_Command_Id",Trace.ERROR);
return new SGIPSubmitRespMessage(buf);
}
if(command_Id == SGIPConstant.Sgip_UserRpt_Command_Id )//UserRpt消息
{
TraceFactory.getTrace().trace("Sgip_UserRpt_Command_Id",Trace.ERROR);
return new SGIPUserRptMessage(buf);
}
if(command_Id == SGIPConstant.Sgip_Trace_Resp_Command_Id )//Trace_Resp消息
{
TraceFactory.getTrace().trace("Sgip_Trace_Resp_Command_Id",Trace.ERROR);
return new SGIPTraceRespMessage(buf);
}
if(command_Id == SGIPConstant.Sgip_Report_Command_Id)//Report消息
{
TraceFactory.getTrace().trace("Sgip_Report_Command_Id",Trace.ERROR);
return new SGIPReportMessage(buf);
}
//中断和心跳消息是SP->ISMG,ISMG->SP都有,因此在此要处理提交和回复的消息。
if(command_Id == SGIPConstant.Sgip_Unbind_Command_Id )//Active_Test_Rep消息
{
TraceFactory.getTrace().trace("Sgip_Unbind_Command_Id",Trace.ERROR);
return new SGIPUnbindMessage(buf);
}
if(command_Id == SGIPConstant.Sgip_Unbind_Resp_Command_Id )//Active_Test消息
{
TraceFactory.getTrace().trace("Sgip_Unbind_Resp_Command_Id",Trace.ERROR);
return new SGIPUnbindRespMessage(buf);
}
else
return null;
}

我的系统设置了超时控制,现在遇到2个问题: 1:如果我在程序片段中有**号的2行代码不要,这样当对方通讯出现异常的时候我这边能铺捉到,并等段时间进行重连接(这是我希望的),但是当在晚上无发送量的情况下,在SOCKET连接正常的情况下会抛出读超时异,这是系统会返回的连接和抛出超时异常,做了许多无用功(这中情况在有数据的情况下几乎不会发生).2:假如我要带**的两行代码,这样在没有消息发送,且通讯正常的情况下不用重起,但是却不能在对方SOCKET异常的情况下铺捉异常,系统不能重起(重起是根据异常情况以否决定是否重起),现在这两个问题我只能同时满足一个.现在希望能2个都得到满足,即:既希望对方SOCKET异常的时候抛出异常,自动重起,恢复连接,又希望在没有数据到达且双方连接正常的情况下,无异常抛出,系统不用返回的重新初始化SOCKET连接,请各位朋友帮我想想看有没有办法解决这个.Socket及ServerSocket及相关的代码我已经看过了,还是没有什么好的办法.急!!!!!!!!!!!!!!
请各位 帮忙了!!
...全文
63 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧