设为首页
收藏本站
开启辅助访问
切换到窄版
登录
立即注册
中问网首页
我的收藏
站长博客
搜索
搜索
本版
帖子
用户
第一问答网
»
论坛
›
中问网
›
问答
›
请教如何判断SOCKET长连接通信中,一段时间内是否收到对 ...
返回列表
发新帖
请教如何判断SOCKET长连接通信中,一段时间内是否收到对方的信息.及相关问题.
[复制链接]
11
|
4
|
2007-1-24 12:56:49
|
显示全部楼层
|
阅读模式
对方的接口文档中要求:
1.2业务接口
服务端地址:211.151.234.131端口号:9007
Tcp协议适合发送量大,发送和接收比较及时,对于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】(回车换行)
如果所有服务注册成功,服务器返回给客户端字符串:
Pass(回车换行)
否则将断开连接。对于一次未连接成功,应至少在20秒以后再重试连接,禁止连续的重试连接。
请问红色的话,我应该如何设置三分钟内不收到服务器任何指令将主动断开连接并重新连接.
我写的主要的客户端的代码:
父类线程:
public class ParentThread extends Thread {
private Socket socket;
protected BufferedReader reader;
protected BufferedWriter writer;
protected boolean isConnection=false;
protected boolean login(int type){
LoginRequest login = new LoginRequest(type);
//login.setRegType(type);
login.create();
try {
writer.write(login.getOrder());
writer.flush();
String str_order = reader.readLine();
System.out.println(str_order);
//
PassResponse pass = new PassResponse(str_order);
//
if(pass.isPass()){
if("Pass".equals(str_order)){
return true;
}else{
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void init(){
try {
socket = new Socket(Const.distributeCenterIP,Const.distributeCenterPort);
//socket.setSoTimeout(50000);
reader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
isConnection=true;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void closeSocket(){
isConnection=false;
try {
if(reader != null)reader.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(writer != null)writer.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(socket != null)socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收短信连接,继承父类线程
public class SmsReceiver extends ParentThread {
private boolean toReconnection=false;
@Override
public void run() {
// TODO Auto-generated method stub
try{
init();
//登陆
boolean b = 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(Exception e){
toReconnection = true;
}
while(true){
if(toReconnection){
/**20秒连接一次*/
try {
sleep(20000);
init();
//登陆
boolean b = 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 (InterruptedException e) {
e.printStackTrace();
}
}
if(!isConnection){//连接失败
toReconnection = true;
continue;
}
try {
String str_order = reader.readLine();
System.out.println(str_order);
Order order = new Order(str_order);
//如果为测试指令,发送回应
//if(order.isTestOrder()){
if("test".equals(str_order)){
System.out.println("---测试----"
;
writer.write(order.testOrder);
writer.flush();
toReconnection = false;
continue;
}
//处理
SMSBusinessCenter sbc = new SMSBusinessCenter(order);
Properties prop=sbc.performTask();
//发送回应
System.out.println(prop.getProperty("CommandId"
);
received(prop.getProperty("CommandId"
);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void received(String cid){
//Received received = new Received(Utils.getCurrentCommandId());
//
Received received = new Received(cid);
//
received.create();
try {
writer.write("Received CommandId="+cid+"\r\n"
;
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
发送短信连接,继承父类线程:
public class SmsSend extends ParentThread {
private boolean toReconnection=false;
@Override
public void run() {
try{
init();
//登陆
boolean b = 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(Exception e){
toReconnection = true;
}
while(true){
if(toReconnection){
/**20秒连接一次*/
try {
sleep(20000);
init();
//登陆
boolean b = 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 (InterruptedException e) {
e.printStackTrace();
}
}
if(!isConnection){//连接失败
toReconnection = true;
continue;
}
try {
String str_order = reader.readLine();
Order order = new Order(str_order);
//如果为测试指令,发送回应
if(order.isTestOrder()){
writer.write(order.testOrder);
toReconnection = false;
//continue;
}
//
//处理
//
SMSBusinessCenter sbc = new SMSBusinessCenter(order);
//
Vector msgs = sbc.getSendMsg();
//
//发送短信
//
//for(){
//
writer.write(""
;
//
//
//发送短信
if(SmsMain.list!=null&&SmsMain.list.size()>0){
synchronized (SmsMain.list) {
for (Iterator iterator = SmsMain.list.iterator(); iterator
.hasNext()
{
SubmitRequest sr = (SubmitRequest) iterator.next();
StringBuffer sb = new StringBuffer();
sb.append(Const.order_submit+" ")
.append("CommandId="+sr.getCommandId())
.append("&GateWay="+sr.getGateWay())
.append("&GateName="+sr.getGateName())
.append("&ItemId="+sr.getItemId())
.append("&SpNumber="+sr.getSpNumber())
.append("&UserNumber:="+bin2hex(sr.getUserNumber()))
.append("&UserNumberType="+sr.getUserNumberType())
.append("&FeeNumber="+sr.getFeeNumber())
.append("&FeeNumberType="+sr.getFeeNumberType())
.append("&FeeType="+sr.getFeeType())
.append("&ScheduleTime="+sr.getScheduleTime())
.append("&ExpireTime="+sr.getExpireTime())
.append("&MtFlag="+sr.getMtFlag())
.append("&ReportFlag="+sr.getReportFlag())
.append("&MsgCode="+sr.getMsgCode())
.append("&MsgId="+sr.getMsgId())
.append("&ExtData:="+sr.getExtData())
.append("&TP_pId="+sr.getTp_pId())
.append("&TP_udhi="+sr.getTp_udhi())
.append("&Msg:="+bin2hex(sr.getMsg()))
.append("&LinkID="+sr.getLinkID())
.append("&ItemType="+sr.getItemType()+"\r\n");
writer.write(sb.toString());
writer.flush();
SmsMain.list.remove(sr);
}
}
//接受回应
received();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void received(){
try {
String line = reader.readLine();
//
Received received = new Received(line);
//
received.parse();
System.out.println(line);
SmsMain.log.info(line);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 字符串转换成十六进制值
* @param bin String 转换成十六进制的字符串
* @return
*/
public static String bin2hex(String bin) {
char[] digital = "0123456789ABCDEF".toCharArray();
StringBuffer sb = new StringBuffer("");
byte[] bs = bin.getBytes();
int bit;
for (int i = 0; i > 4;
sb.append(digital[bit]);
bit = bs
& 0x0f;
sb.append(digital[bit]);
}
return sb.toString();
}
}
回复
使用道具
举报
千问
|
2007-1-24 12:56:49
|
显示全部楼层
想问什么问题? 贴这些代码说明什么?
回复
使用道具
举报
千问
|
2007-1-24 12:56:49
|
显示全部楼层
//socket.setSoTimeout(50000);
timeout不就的了
回复
使用道具
举报
千问
|
2007-1-24 12:56:49
|
显示全部楼层
timeout
对存放接收消息的堆栈检查
对ping对方接收响应的时点进行检查
回复
使用道具
举报
千问
|
2007-1-24 12:56:49
|
显示全部楼层
好比socket.timeout(30000)
我如何判断在这三十秒钟我的SOCKET是否接到消息?
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
千问
主题
0
回帖
4882万
积分
论坛元老
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
积分
48824836
加好友
发消息
回复楼主
返回列表
问答
热门排行
1
这个是哪部恐怖片出来过的鬼
2
祖国在我心中的征文
3
过期中药
4
索爱K550能下载安装播放器吗?在哪下载?
5
双子座女生
6
鞋打个地名
7
东方神起2009演唱会完整版 下载地址
8
太阁立志传4水军技能
9
玩穿越fps值突然降低然后卡屏4秒后好
10
蒲巴甲在东风雨里演的是什么,介绍一下
11
青少年叛逆的生理学、心理学原因是什么?
12
dnf cof怎么降低
13
本溪旅游
14
新疆沙湾明天会不会有地震?
15
L7moto-txt下进去了,也安装完了,就点开始进不去
16
当你看一个男人时,你们对视,男人一直不移开视线,一般会是哪些原因?(两人本来就认识的)
17
背后的故事至上励合小美照相片断
18
数学题目,在线等
19
杨千嬅新歌
20
excel 问题
21
009年陕西省考试录用公务员什么时候面试
22
我是河南考生,今年的分数大概在500,能上江西财大 的专科吗
23
一个人穷,但是另一个人比较富裕,但又偏偏瞧不起穷的人,现在穷的那个人很自卑?
24
请帮我看下内分泌检查结果,十分感谢!
25
请问十个平米的小房间需要多大的空调呀?
26
经典动画片
27
以人名命名的县有哪些
28
大同幼师做几路公交能去 详细点
29
光耦是什么东西?
30
我的电脑的系统时间每次开机都恢复到以前了,请问怎么解决?
31
关于自考
32
把房子从父亲那过户到我名下,要怎么做
33
一些青春励志的小说
34
小腹右侧疼还伴有腿疼是什么原因
35
成语接龙
36
美女们你们是怎么卸隔离霜的?
37
大家帮我比较一下华硕M50S84VN跟联想Y550啊..
38
“零点食分”是什么东东?
39
急!帮忙修改首诗
40
我买了六月十五号日照到牡丹江的K1450次列车;早五点十分上车,我没坐上车.车票还有吗??
41
我帅吗?
42
广州火车站到中山富华总站怎么走 最便宜的是那种?
43
长风破浪会有时,直挂云帆济沧海
44
淘米的新游戏——赛尔号
45
狗狗被骨头卡以后不吃不喝也不大便小便
46
办公室倡议书
47
一个人去旅游,现在郑州,请问下一站去哪里比较好
48
请问四川农业大学09年有没有专科专业?
49
小学三年级填空题
50
免费点亮qq7钻 怎么刷?
51
小硕毕业,想在齐河县找工作,没有关系,不知难度怎么样
52
人为什么活着
53
新疆沙湾6月3日地震
54
天龙八部4433这些是什么意思?
55
梁星的英文名怎么写
56
真丝面料的清洗
57
数列,高手来
58
潜江城南中学录取分数线
59
交通运输专业考研
60
经常感到压抑,怎么办?
61
金色凉鞋搭配什么样的裤子好看啊?我的鞋是坡跟的
62
诺基亚N97都有什么功能啊?最近想出手!!
63
我的眼神总是飘忽不定,不敢看人的眼睛,害怕看到不好的眼神;
64
爱听的歌曲或喜爱的明星
65
上海宝山区淞南附近有没有学英语的学校???
66
老友记~
67
甲醛对生育有没有影响
68
玩3D游戏CPU风扇多少温度才正常
69
CSOL衣服
70
米兰应该怎样繁殖?
71
找:网络游戏制作公司
72
机战和热血英豪
73
帮忙找些游戏主角图片
74
三星S8300。。。。。。。。。。。。。。。
75
nokia3230 和moto V8 哪个好?
76
聪明的各种意思
77
求DJ铃声要好听的 嗨的
78
进士甲科
79
DNF召唤师怎么加点?
80
小虎队小浣熊干脆面
81
报1本的 农林 有哪个 可以降20?
82
qq炫舞名字
83
26岁没有男朋友是不是很尴尬的事情?就是没看得上眼的
84
如何用minitab15画频率直方图
85
可不可以告诉我得的是什么妇科病?我的症状可以使用泡腾片吗?
86
诺基亚6070上网
87
重庆邮电福建第十,景陶过十,我该选哪所?
88
请问河北足球在乙级还有球队吗
89
在sd敢达里我的号不知道在那个区了,因为我好久没有玩,忘了在那个区了,怎样才知道我的号在那个区啊?
90
丝路英雄中招募英雄得价格越高英雄属性就越好吗?
91
大跨度梁钢筋接头如何处理?
92
微机原理单项选择题
93
指甲掉了是否可再生
94
神鬼传奇 秘宝图哪些坐标出武器
95
主板显示有2块网卡
96
已知 int i=1,j=2,z 则执行语句:n=i<j?i++:j++; 则i和j的值是多少?请讲解下!谢谢
97
09年奇迹世界人气怎么样?
98
外地户口买社保
99
寻秦记在皇陵里看不见小盘
100
CS ONLINE 蓝屏