socket通信例子.docx
《socket通信例子.docx》由会员分享,可在线阅读,更多相关《socket通信例子.docx(14页珍藏版)》请在冰豆网上搜索。
socket通信例子
socket通信例子
publicvoidsend()
{
while(true)
{
stringsql="selecttop100*fromsend";
SqlDataReaderdatareader=sqlserver.ExecuteSqlDataReader(sql);
if(datareader.HasRows)//有记录才进行网关联接
{
stringshow;
stringhost;
//intport=Convert.ToInt16("8801");
//host=Dns.GetHostName();
//host="192.168.123.110";
sockettemp=newsocket();
Socketsend=temp.connectSocket(this.remote_ip,this.remote_port);
if(send==null)
{
this.send_listbox("打开远程SMG失败");
}
else
{
this.send_listbox("打开远程SMG成功");
byte[]bind_content=sgip_test.bind(count);
count_step();
byte[]receive=newbyte[256];
byteflag;
send.Send(bind_content,bind_content.Length,0);//bind
send.Receive(receive,29,0);//bind_resp读取29位
flag=sgip_test.bind_resp_result(receive);
if(flag==0)
this.send_listbox("成功联接到网关");
else
this.send_listbox("联接网关失败");
while(datareader.Read())
{
stringspnumber=datareader["spnumber"].ToString().Trim();
stringchargenumber=datareader["chargenumber"].ToString().Trim();
stringusernumber=datareader["usernumber"].ToString().Trim();
stringservicetype=datareader["servicetype"].ToString().Trim();
bytefeetype=Byte.Parse(datareader["feetype"].ToString().Trim());
stringfeevalue="/datareader["feevalue"].ToString().Trim();
string"content=datareader["content"].ToString().Trim();
byte[]submit=sgip_test.submit(spnumber,chargenumber,usernumber,servicetype,feetype,feevalue,content,CorpId,count);
send.Send(submit,submit.Length,0);//sumbmit
count_step();
send.Receive(receive,29,0);//submit_resp
flag=sgip_test.submit_resp_result(receive);
if(flag==0)
{
this.send_listbox("手机号:
"+usernumber+" 业务代码:
"+servicetype+" SP下行:
"+spnumber);
this.send_listbox("消息内容:
"+content);
this.send_listbox("消息发送成功");
stringdel_sql="deletefromsendwhereid="+datareader["id"].ToString().Trim();
sqlserver.ExecuteSqland(del_sql);
}
else
this.send_listbox("消息发送失败");
}
datareader.Close();
byte[]unbind=sgip_test.unbind(count);
count_step();
send.Send(unbind,unbind.Length,0);//unbind
send.Receive(receive,20,0);//unbind_resp只有消息头
send.Close();
temp=null;
}
}
else
datareader.Close();//如果没有记录的话,就马上删除联接,不然要超时出错
Thread.Sleep(100);
}
}
数据写入字节流
publicbyte[]submit(stringSPNumber,stringChargeNumber,stringUserNumber,stringServiceType,byteFeeType,stringFeeValue,stringMessageContent,stringCorpId,uintcount)
{
//SPNumber21字节textSP的接入
//ChargeNumber 21字节text付费,手机前加“86”国别标志;当且仅当群发且对用户收费时为空;如果为空,则该条短消息产生的费用由UserNumber代表的用户支付;如果为全零字符串“0000”,表示该条短消息产生的费用由SP支付。
//UserCount1字节int接收短消息的手机数量,取值X围1至100
//UserNumber21字节text接收该短消息的手机号,该字段重复UserCount指定的次数,手机前加“86”国别标志
//CorpId5字节text企业代码,取值X围0-99999
//ServiceType10字节text业务代码,由SP定义
//FeeType1字节int计费类型
//FeeValue6字节text取值X围0-99999,该条短消息的收费值,单位为分,由SP定义对于包月制收费的用户,该值为月租费的值
//GivenValue6字节text取值X围0-99999,赠送用户的话费,单位为分,由SP定义,特指由SP向用户发送广告时的赠送话费
//AgentFlag1字节int代收费标志,0:
应收;1:
实收
//MorelatetoMTFlag1字节int引起MT消息的原因0-MO点播引起的第一条MT消息;1-MO点播引起的非第一条MT消息;2-非MO点播引起的MT消息;3-系统反馈引起的MT消息。
//Priority1字节int优先级0-9从低到高,默认为0
//ExpireTime16字节text短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值。
时间内容为16个字符,格式为”yymmddhhmmsstnnp”,其中“tnnp”取固定值“032+”,即默认系统为时间
//ScheduleTime16字节text短消息定时发送的时间,如果为空,表示立刻发送该短消息。
时间内容为16个字符,格式为“yymmddhhmmsstnnp”,其中“tnnp”取固定值“032+”,即默认系统为时间
//ReportFlag1字节int状态报告标记0-该条消息只有最后出错时要返回状态报告1-该条消息无论最后是否成功都要返回状态报告2-该条消息不需要返回状态报告3-该条消息仅携带包月计费信息,不下发给用户,要返回状态报告其它-保留缺省设置为0
//TP_pid1字节intGSM协议类型。
详细解释请参考GSM03.40中的9.2.3.9
//TP_udhi1字节intGSM协议类型。
详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
//MessageCoding1字节int短消息的编码格式。
0:
纯ASCII字符串3:
写卡操作4:
二进制编码8:
UCS2编码15:
GBK编码其它参见GSM3.38第4节:
SMSDataCodingScheme
//MessageType1字节int信息类型:
0-短消息信息其它:
待定
//MessageLength4字节int短消息的长度
//MessageContentText短消息的内容
//Reserve8字节text保留,扩展用
//feetype
//计费类别定义
//用户计费类别 描述
//0 “短消息类型”为“发送”,对“计费用户”不计信息费,此类话单仅用于核减SP对称的信道费
//1 对“计费用户”免费 2 对“计费用户”按条计信息费3 对“计费用户”按包月收取信息费4 对“计费用户”的收费是由SP实现
byte[]sp_number=Encoding.ASCII.GetBytes(pack.into_string(SPNumber,21));
bytecou=1;
if(!
(UserNumber.Substring(0,2).Equals("86")))
UserNumber="86"+UserNumber; //还没有加入手机号是否正确的识别
byte[]user_number=Encoding.ASCII.GetBytes(pack.into_string(UserNumber,21));
if(ChargeNumber.Length<1) //chargenumber不写的话,默认为接收手机计费
ChargeNumber=UserNumber;
else
{
if(!
(ChargeNumber.Substring(0,2).Equals("86")))
ChargeNumber="86"+ChargeNumber;
}
byte[]charge_number=Encoding.ASCII.GetBytes(pack.into_string(ChargeNumber,21));
byte[]corp_id=Encoding.ASCII.GetBytes(pack.into_string(CorpId,5));
byte[]service_type=Encoding.ASCII.GetBytes(pack.into_string(ServiceType,10));
byte[]fee_value="/Encoding.ASCII.GetBytes(pack.into_string(FeeValue,6));
byte[]"given_value="/Encoding.ASCII.GetBytes(pack.into_string(""",6));//不填写
byteagent_flag=1;//实收
bytemore_late_to_mtflag;
switch(FeeType) //对momt_flag做处理
{
case1:
//对“计费用户”免费
more_late_to_mtflag=0;
break;
case2:
//对“计费用户”按条计信息费
more_late_to_mtflag=0;
break;
case3:
//对“计费用户”按包月收取信息费
more_late_to_mtflag=3;
break;
default:
more_late_to_mtflag=0;
break;
}
//if(feetype==1)//2按条计信息费
//more_late_to_mtflag=0;//暂时写成这个包月时写3
bytepriority=0;
byte[]expire_time=Encoding.ASCII.GetBytes(pack.into_string("",16));//不填写
byte[]schedule_time=Encoding.ASCII.GetBytes(pack.into_string("",16));//不填写
bytereport_flag=1;//暂时写成这个
bytetp_pid=0;//暂时写成这个,具体的不知道008或者15
bytetp_udhi=0;//暂时写成这个,具体的不知道
bytemessage_coding=0;//暂时写成这个,具体的不知道
//MessageCoding1字节int短消息的编码格式。
0:
纯ASCII字符串3:
写卡操作4:
二进制编码8:
UCS2编码15:
GBK编码其它参见GSM3.38第4节:
SMSDataCodingScheme
bytemessage_type=0;
byte[]message_content=Encoding.Default.GetBytes(MessageContent); //没有验证内容长度
intmessage_length=0;//
//byte[]msg_len=Int2Bytes((uint)message_length);//中转一下数据
byte[]reserve=Encoding.ASCII.GetBytes(pack.into_string("",8));
intbody_length=sp_number.Length+charge_number.Length+1+user_number.Length+corp_id.Length+service_type.Length+1+fee_value.Length;
body_length=body_length+given_value.Length+3+expire_time.Length+schedule_time.Length+5+4+message_content.Length+reserve.Length;
// agentflag,morelatetomtflag,priority pid,udhi...messagetype
message_length=body_length;
//byte[]msg_len=Int2Bytes((uint)message_length);
byte[]msg_len=pack.Int2Bytes((uint)message_content.Length);
//消息体
intMessage_Length=0; //4字节
uintmand_ID=0x3; //4字节
//stringSequence_Number=get_sequence_number(count); //12字节
byte[]seq_num=pack.get_sequence_number(count);
//byte[]msg_len=Int2Bytes(Message_Length);
byte[]_id=pack.Int2Bytes(mand_ID);
//byte[]seq_num=Encoding.Default.GetBytes(Sequence_Number);
//inthead_length=msg_len.Length+_id.Length+seq_num.Length;
inthead_length=20;
//消息头
Message_Length=head_length+body_length;
byte[]hmsg_len=pack.Int2Bytes((uint)Message_Length);//重新计算后再写入总体长度
byte[]content=newbyte[Message_Length];//定义总体submit的包长度
//写入数据流中
hmsg_len.CopyTo(content,0); //4字节
_id.CopyTo(content,4); //4字节
seq_num.CopyTo(content,8); //12字节
//消息头
sp_number.CopyTo(content,20); //21字节
charge_number.CopyTo(content,41); //21字节
content[62]=cou; //1字节
user_number.CopyTo(content,63);//21字节
corp_id.CopyTo(content,84);//5字节
service_type.CopyTo(content,89);//10字节
content[99]=FeeType;//1字节
fee_value.CopyTo(content,100); //6字节
given_value.CopyTo(content,106);//6字节
content[112]=agent_flag;//1字节
content[113]=more_late_to_mtflag;//1字节
content[114]=priority;//1字节
expire_time.CopyTo(content,115);//16字节
schedule_time.CopyTo(content,131);//16字节
content[147]=report_flag;//1字节
content[148]=tp_pid;//1字节
content[149]=tp_udhi;//1字节
content[150]=message_coding;//1字节
content[151]=message_type;//1字节
msg_len.CopyTo(content,152);//4字节
message_content.CopyTo(content,156);//长度为message_length
reserve.CopyTo(content,156+message_content.Length);
//消息体封装完毕
stringseq_num_string=pack.get_seq_num(seq_num);//恢复出seq_num来好写入数据库,做记录用
stringadd_sql="insertintolog_send(spnumber,chargenumber,usernumber,servicetype,feetype,feevalue,content,seq_num)values(";
add_sql=add_sql+"'"+SPNumber+"',";
add_sql=add_sql+"'"+ChargeNumber+"',";
add_sql=add_sql+"'"+UserNumber+"',";
add_sql=add_sql+"'"+ServiceType+"',";
add_sql=add_sql+"'"+FeeType.ToString()+"',";
add_sql=add_sql+"'"+FeeValue+"',";
add_sql=add_sql+"'"+MessageContent+"',";
add_sql=add_sql+"'"+seq_num_string+"')";
sqlserver.ExecuteSqland(add_sql);
//publicbyte[]submit(stringSPNumber,stringChargeNumber,stringUserNumber,stringServiceType,byteFeeType,stringFeeValue,stringMessageContent,stringCorpId,uintcount)
returncontent;
}
publicbyte[]unbind(uintcount)
{
inti=0;
uintmessage_length=20; //4字节
uintmand_ID=0x2; //4字节
//stringSequence_Number=get_sequence_number(count); //12字节
byte[]seq_num=pack.get_sequence_number(count);
//byte[]msg_len=Int2Bytes(Message_Length);
byte[]_id=pack.Int2Bytes(mand_ID);
byte[]msg_len=pack.Int2Bytes(message_length);
/