客户端不停的向我服务端发送数据此时buff[8]=0x11,服务端接收后,经过计算,发一条数据给客户端,客户端接受到服务端数据后,返回一段数据,此数据用来确认客户端已经接受到服务端发送的数据,此时buff[8]=0x12,。 程序运行后,我只能接收到2条0x11的数据,其余的都是0x12的数据,但我需要储存的数据是0x11的,怎么弄 float temp; Socket serverSocket;//定义socket对象 Thread listenThread;//定义监听线程 Thread threadReceive;//定义接收客户端数据线程 Socket socket; DateTime t; byte p1 = 0x00; byte p2 = 0x64; float voltage_Value; private void button1_Click(object sender, EventArgs e) { IPAddress ip = IPAddress.Parse(this.text_ip.Text.Trim()); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//定义一个socket try { serverSocket.Bind(new IPEndPoint(ip, Convert.ToInt32(this.text_port.Text.Trim()))); serverSocket.Listen(10);//收听模式 listenThread = new Thread(ListenClientConnect); listenThread.Start();//start方法对线程进行运行 this.button_start.Enabled = false; this.Invoke(new Action(() => { text_log1.Text +="监听成功" + "\r\n"; })); } catch { MessageBox.Show("监听异常", "监听异常"); } } private void ListenClientConnect() { while (true) { socket = serverSocket.Accept();//监听到客户端的连接,获取双方的通信socket threadReceive = new Thread(Receive);//创建线程循环接收客户端发送的数据 threadReceive.Start(socket);//传入双方通信 } } private void Receive(object socket)//接收客户端数据 { try { Socket myClientSocket=(Socket)socket; while  (true) { byte[] buff = new byte[1024 * 1024 * 2];//接收数据数组 int r = myClientSocket.Receive(buff);//接收数据 if (buff[0] != 0x5A && buff[1] != 0xA5) {break;} if (buff[2] != 00 && buff[3] != 01) {break;} if (buff[4]!= 00 && buff[5] != 01) {break;} //if (buff[6] == 0x00 && buff[7] == 0X08) if (buff[8] == 0x11) { byte check = (byte)(buff[8]+buff[9] + buff[10] + buff[11] + buff[12]+buff[13] + buff[14]); if (buff[15] == check) { t = DateTime.Now; string T = t.ToString(); temp = BitConverter.ToSingle(buff, 9); string TEMP = temp.ToString(); string str1 = "当前温度为" + temp; this.Invoke(new Action(() => { text_log1.Text += T + str1 + "\r\n"; })); float f2; float.TryParse(TEMP, out f2); SQL sql = new SQL(); sql.ExecSQL(f2, t); } } if (buff[8] == 0x12) { Console.WriteLine("AAA"); } pid V = new pid(); voltage_Value = V.mPIDCalc(temp, 50); float Spwm = voltage_Value * 330; if (Spwm < 0) { Spwm = 0; } short pwm = Convert.ToInt16(Spwm); p1 = (byte)(pwm >> 8); p2 = (byte)(pwm & 0x00ff); Console.WriteLine(p1); Console.WriteLine(p2); byte[] buffer = new byte[18]; buffer[0] = 0x5A; buffer[1] = 0xA5; buffer[2] = 0x00; buffer[3] = 0x01; buffer[4] = 0x00; buffer[5] = 0x01; buffer[6] = 0x00; buffer[7] = 0x0A; buffer[8] = 0x11; string year = DateTime.Now.Year.ToString(); byte[] timeyear = new byte[4]; timeyear = System.Text.Encoding.Default.GetBytes(year); buffer[9] = (byte)((timeyear[2] - 48) * 10 + timeyear[3] - 48); buffer[10] = (byte)(DateTime.Now.Month); buffer[11] = (byte)(DateTime.Now.Day); buffer[12] = (byte)(DateTime.Now.Hour); buffer[13] = (byte)(DateTime.Now.Minute); buffer[14] = (byte)(DateTime.Now.Second); buffer[15] = (byte)p1; buffer[16] = (byte)p2; byte sendcheck = (byte)(buffer[8] + buffer[9] + buffer[10] + buffer[11] + buffer[12] + buffer[13] + buffer[14] + buffer[15] + buffer[16]); buffer[17] = sendcheck; myClientSocket.Send(buffer); } } catch { MessageBox.Show("接收数据失败", "接收数据失败"); } }//接收数据并存入数据库

解决方案 »

  1.   

    老问题,粘包,分包。你认为myClientSocket.Receive就是一条数据,其实不一定至于“我只能接收到2条0x11的数据”,其实也不一定正确打开方式,数据流处理---》判定粘包,分包(当然还有处理异常提交,不过通常内部系统可以不做异常判定,因为调试稳定不存在这种情况,如果是对外得系统,我们无法保证别人提交格式一定合法)
    如果你觉着一时半会无法理解,你可以让你得发送端,每发一条休眠200-500毫秒,暂时可以在一定程度上解决问题,不过隐患始终存在只是几率小点(当然是小包,如果是大包,tcp自然分包,你休眠也搞不定)