110,536
社区成员
发帖
与我相关
我的任务
分享
private void recv(object socketclientpara)
{
Socket socketServer = socketclientpara as Socket;
socketServer.ReceiveTimeout = 300000; //设置超时时间60S,超时未收到数据则自动退出线程
while (true)
{
//创建一个内存缓冲区 其大小为1024*1024字节 即1M
byte[] arrServerRecMsg = new byte[1024 * 1024];
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
try
{
int length = socketServer.Receive(arrServerRecMsg);
if (length<=0)
{
textBox3.AppendText("客户端" + socketServer.RemoteEndPoint + "已经中断连接" + "\r\n"); //提示套接字监听异常
listBoxOnlineList.Items.Remove(socketServer.RemoteEndPoint.ToString());//从listbox中移除断开连接的客户端
socketServer.Close();//关闭之前accept出来的和客户端进行通信的套接字
break;
//throw new Exception();
}
//将机器接受到的字节数组转换为人可以读懂的字符串
string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
if (strSRecMsg.Length > 0)
{
//将发送的字符串信息附加到文本框txtMsg上
textBox3.AppendText("客户端:" + socketServer.RemoteEndPoint + ",时间:" + GetCurrentTime() + "\r\n" + strSRecMsg + "\r\n\n");
}
//插入数据库的一系列操作并回复信息操作
//写入日志
string errors="";
bool aa = WriteFile(strSRecMsg, out errors);
}
catch (Exception ex)
{
if (ex.Message.ToString() != "您的主机中的软件中止了一个已建立的连接。" && ex.Message.ToString().Length != 45)
{
textBox3.AppendText("客户端" + socketServer.RemoteEndPoint + "已经中断连接" + "\r\n"); //提示套接字监听异常
listBoxOnlineList.Items.Remove(socketServer.RemoteEndPoint.ToString());//从listbox中移除断开连接的客户端
socketServer.Close();//关闭之前accept出来的和客户端进行通信的套接字
break;
}
}
}
}
string MeterNum = "";
if (strSRecMsg.Length >= 48)
{
MeterNum = strSRecMsg.Substring(2, 8);
string ip = socketServer.RemoteEndPoint.ToString();
//更改数据库连接记录
//先从数据库读取是否有此客户端的连接。如果没有则插入如果有则修改。
UpdateWebIP(MeterNum, ip);
//判断是否为上传数据
string State = strSRecMsg.Substring(10, 2);
if (State == "0")//判断是否为回复状态
{
#region 命令发送情况状态判断
string State_Send = strSRecMsg.Substring(12, 2);
if (State_Send == "01")//接收成功
{
//break;
}
else if (State_Send == "02")//数据格式错误
{
//break;
}
else if (State_Send == "03")//断开连接
{
//更改发送命令的状态为可发送
string SQL = "update ";
int Num = SqlHelper.ExecuteSql(SQL);
}
#endregion
}
else if (State == "01" || State == "02" || State == "03" || State == "04" || State == "06")
{
#region 一般处理情况直接插入
#region 判断是否为命令回复,若是则修改数据库命令
if (State == "04")
{
string UploadState = "";
string SqlUpdate = "";
string Stares = strSRecMsg.Substring(12, 2).ToString();
byte SomeOneState_Upload = Convert.ToByte(Stares, 16);
if ((SomeOneState_Upload & 0x01) == 0x01)
{
UploadState = "2";
}
if ((SomeOneState_Upload & 0x02) == 0x02)
{
UploadState = "4";
}
if ((SomeOneState_Upload & 0x04) == 0x04)
{
UploadState = "9";
}
if ((SomeOneState_Upload & 0x08) == 0x08)
{
UploadState = "5";
}
if ((SomeOneState_Upload & 0x10) == 0x10)
{
UploadState = "0','1','3','7','8";
}
if ((SomeOneState_Upload & 0x20) == 0x20)
{
UploadState = "10";
}
//修改数据库命令状态
SqlUpdate = "update ";
SqlHelper.ExecuteSql(SqlUpdate);
}
#endregion
#region 插入数据并回复状态
//插入接收数据
string sendMsg = "";
string SQlsend = "insert";
int num = SqlHelper.ExecuteSql(SQlsend);
if (num > 0)
{
sendMsg = "DD00010000";
}
else
{
sendMsg = "DD00020000";
}
string ReplyMessage = Localtest.Class.encrypt.GetXor(sendMsg);
string NewCon = sendMsg + ReplyMessage + "AA";
//将要发送的信息转化为字节数组,因为Socket发送数据时是以字节的形式发送的
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(NewCon);
//发送数据
dic[ip].Send(bytes);
//显示在服务端
textBox3.AppendText("【" + GetCurrentTime() + "】发送给表:" + MeterNum + "\r\n" + NewCon + "\r\n");
#endregion
#endregion
}
//写入日志
string errors = "";
bool RiZhi = WriteFile(strSRecMsg + "", out errors);
}
socketServer.Receive(arrServerRecMsg)
之后就立刻以为收到了完整的消息,而应该累积收到的内容,判断消息结束符号收到(比如说对于 http 协议就是用两个连续的“回车换行”作为消息头和消息体的结束符号)了之后才开始解析内容。
不过你的问题是“保存数据库的结果不对”,可是根本看不到你保存数据库的代码设计啊?你不贴出实际的代码、不描述自己的设计,怎么发现问题呢?