客戶端不停的向我服務端發送資料此時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("接收資料失敗", "接收資料失敗"); } }//接收資料并存入資料庫
uj5u.com熱心網友回復:
代碼太亂,不能整理一下再發么uj5u.com熱心網友回復:
老問題,粘包,分包。你認為myClientSocket.Receive就是一條資料,其實不一定至于“我只能接收到2條0x11的資料”,其實也不一定
正確打開方式,資料流處理---》判定粘包,分包(當然還有處理例外提交,不過通常內部系統可以不做例外判定,因為除錯穩定不存在這種情況,如果是對外得系統,我們無法保證別人提交格式一定合法)
如果你覺著一時半會無法理解,你可以讓你得發送端,每發一條休眠200-500毫秒,暫時可以在一定程度上解決問題,不過隱患始終存在只是幾率小點(當然是小包,如果是大包,tcp自然分包,你休眠也搞不定)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/93455.html
標籤:C#
上一篇:求各位大神看看我這個安裝出現什么問題了,剛上大學什么都還不懂
下一篇:C#影像互動與多執行緒
