判断SOCKET通信中客户端在s内未发送数据或者未收到服务器发送的数据自动断开Word文件下载.docx
- 文档编号:19526886
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:13
- 大小:18.53KB
判断SOCKET通信中客户端在s内未发送数据或者未收到服务器发送的数据自动断开Word文件下载.docx
《判断SOCKET通信中客户端在s内未发送数据或者未收到服务器发送的数据自动断开Word文件下载.docx》由会员分享,可在线阅读,更多相关《判断SOCKET通信中客户端在s内未发送数据或者未收到服务器发送的数据自动断开Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
接收;
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();
protectedvoidinit(){
socket=newSocket(Const.distributeCenterIP,Const.distributeCenterPort);
//socket.setSoTimeout(50000);
reader=newBufferedReader(newInputStreamReader(socket.getInputStream()));
writer=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));
isConnection=true;
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
protectedvoidcloseSocket(){
isConnection=false;
if(reader!
=null)reader.close();
if(writer!
=null)writer.close();
if(socket!
=null)socket.close();
}
接收短信连接,继承父类线程
publicclassSmsReceiverextendsParentThread{
privatebooleantoReconnection=false;
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
init();
//登陆
booleanb=login(Const.reg_type_receive);
if(!
b){//登陆失败,退出
SmsMain.log.error("
登陆失败,程序退出!
请检查注册名和口令是否正确"
;
SmsMain.log.info("
注册名名:
"
+Const.reg_name);
用户口令:
+Const.reg_pwd);
注册类型:
+Const.reg_type_receive);
}catch(Exceptione){
toReconnection=true;
while(true){
if(toReconnection){
/**20秒连接一次*/
sleep(20000);
toReconnection=false;
break;
}catch(InterruptedExceptione){
isConnection){//连接失败
continue;
Orderorder=newOrder(str_order);
//如果为测试指令,发送回应
//if(order.isTestOrder()){
test"
System.out.println("
---测试----"
writer.write(order.testOrder);
toReconnection=false;
//处理
SMSBusinessCentersbc=newSMSBusinessCenter(order);
Propertiesprop=sbc.performTask();
//发送回应
System.out.println(prop.getProperty("
CommandId"
);
received(prop.getProperty("
privatevoidreceived(Stringcid){
//Receivedreceived=newReceived(Utils.getCurrentCommandId());
//Receivedreceived=newReceived(cid);
//received.create();
writer.write("
ReceivedCommandId="
+cid+"
\r\n"
发送短信连接,继承父类线程:
publicclassSmsSendextendsParentThread{
booleanb=login(Const.reg_type_send);
+Const.reg_type_send);
if(order.isTestOrder()){
//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
.hasNext(){
SubmitRequestsr=(SubmitRequest)iterator.next();
StringBuffersb=newStringBuffer();
sb.append(Const.order_submit+"
"
)
.append("
CommandId="
+sr.getCommandId())
GateWay="
+sr.getGateWay())
GateName="
+sr.getGateName())
ItemId="
+sr.getItemId())
SpNumber="
+sr.getSpNumber())
UserNumber:
="
+bin2hex(sr.getUserNumber()))
UserNumberType="
+sr.getUserNumberType())
FeeNumber="
+sr.getFeeNumber())
FeeNumberType="
+sr.getFeeNumberType())
FeeType="
+sr.getFeeType())
ScheduleTime="
+sr.getScheduleTime())
ExpireTime="
+sr.getExpireTime())
MtFlag="
+sr.getMtFlag())
ReportFlag="
+sr.getReportFlag())
MsgCode="
+sr.getMsgCode())
MsgId="
+sr.getMsgId())
ExtData:
+sr.getExtData())
TP_pId="
+sr.getTp_pId())
TP_udhi="
+sr.getTp_udhi())
Msg:
+bin2hex(sr.getMsg()))
LinkID="
+sr.getLinkID())
ItemType="
+sr.getItemType()+"
writer.write(sb.toString());
SmsMain.list.remove(sr);
//接受回应
received();
privatevoidreceived(){
Stringline=reader.readLine();
//Receivedreceived=newReceived(line);
//received.parse();
System.out.println(line);
SmsMain.log.info(line);
/**
*字符串转换成十六进制值
*@parambinString转换成十六进制的字符串
*@return
*/
publicstaticStringbin2hex(Stringbin){
char[]digital="
0123456789ABCDEF"
.toCharArray();
StringBuffersb=newStringBuffer("
byte[]bs=bin.getBytes();
intbit;
for(inti=0;
i<
bs.length;
i++){
bit=(bs&
0x0f0)>
>
4;
sb.append(digital[bit]);
bit=bs&
0x0f;
returnsb.toString();
----------------------------------------------------------
语言:
C#
问题:
在socket通信时,怎么样判断socket双方是否断开连接
我在Server端new了一个socket,然后bind,开了一个线程来accept前来连接的client,每接到一个client前来连接就新开一个线程和它进行通信。
我把Server端得到的socket放到一个集合里,我想知道集合里的socket是否断开连接,如果断开连接我就把它从这个集合里移除。
判断socket是否断开连接,网上有N种说法:
1.Socket.Connected
这个属性只能说明上一次通信时还是正常的。
2.Socket.Pool
这个方法是可以,但是它要从socket里读或写部分数据,如果其他线程从这个socket读写数据,那么数据将会出错。
我在写一个远程通信软件时候就出现这个问题了。
而且
此方法不能检测某些类型的连接问题,例如,网络电缆中断或远程主机意外关闭。
您必须尝试发送或接收数据以检测这些类型的错误。
3.使用心跳包
每隔一段时间,socket一方向另一方发送一段特殊的数据,socket的另一方接到这个数据后回发回来。
这样就能判断socket两方都没有掉线了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 判断 SOCKET 通信 客户端 发送 数据 或者 收到 服务器 自动 断开
链接地址:https://www.bdocx.com/doc/19526886.html