我正在創建一個多線程套接字程序,需要定期向服務器發送兩組數據。客戶端需要每3秒發送一次GPS信息,每4秒發送一次極性信息。我的想法是簡單地創建一個新線程,創建一個無限循環,發送()GPS信息,睡眠()1秒,發送()極性信息,然後睡眠()2秒。這是否足以解決這個問題?對不起,我是套接字編程的新手,所以我不知道任何其他方法。定期從客戶端向服務器發送數據C
回答
你的提出的方案是:
發送的GPS信息,睡眠持續1秒,發送所述極性信息,然後睡2秒
在一段12秒,即導致:
- GPS;睡眠1
- 極性;睡眠1
- 睡眠1
- GPS;睡眠1
- 極性;睡眠1
- 睡眠1
- GPS;睡眠1
- 極性;睡眠1
- 睡眠1
- GPS;睡眠1
- 極性;睡眠1
- 睡眠1
這發出的GPS信息的4倍(正確的)和極性的4倍,並且每3秒,而不是3次,每4秒作爲規範要求。期望的序列可能是:
- GPS;極性;睡眠1
- 睡眠1
- 睡眠1
- GPS;睡眠1
- 極性;睡眠1
- 睡眠1
- GPS;睡眠1
- 睡眠1
- 極性;睡眠1
- GPS;睡眠1
- 睡眠1個
- 睡眠1
注意,在一些二,GPS和極性必須發送。
您可以通過兩種方法中的任何一種來實現此目的。假設你需要使用線程,使用兩個線程,一個等待三秒鐘,一個等待四秒鐘。使用互斥鎖協調對套接字的訪問,以便在12秒的倍數內,仍可以獲得理智的行爲。
int i_gps = 3;
int i_pol = 4;
int t_gps = 0;
int t_pol = 0;
int t_cur = 0;
while (1)
{
if (t_cur == t_gps && t_cur == t_pol)
{
t_cur = t_gps = t_pol = 0; // Avoid integer overflow
}
if (t_cur == t_gps)
{
send GPS
t_gps += i_gps;
}
if (t_cur == t_pol)
{
send polarity
t_pol += i_pol;
}
sleep 1;
t_cur++;
}
您還可以通過改變代碼在循環的結束,以確定哪些發送睡多秒:
但是,你可以用單線程的過程,等待合適的時間間隔做這一切接下來睡覺適當的時間量,並將t_cur
遞增適當的時間量(而不是一直使用1秒)。
如果你需要避免漂移(因爲上面的代碼假設發送過程是瞬時的,而不是),那麼你必須使用亞秒睡眠並捕獲循環開始時的時間並調整休眠間隔允許花費時間來完成發送。
謝謝,我明白這一點,但GPS是3秒,極性是4秒僅僅是一個例子。如果GPS和極性間隔是其他任意值,我很難考慮如何實現這一點。 – marcusc 2014-12-09 14:54:19
我顯示的代碼可以適應(或多或少)任意值的間隔('i_gap'和'i_pol'),僅受限於有效整數的範圍。它也可以概括爲處理任意數量的消息類型,只需要小心一些,並且可以使用一些函數指針。如果您有4秒和8秒的間隔,但您希望4秒鐘的操作發生在0,4,8,12,16,20時......您需要考慮更加困難,而您需要8秒鐘的操作發生在2,10,18,... – 2014-12-09 15:13:06
- 1. 如何從服務器向特定客戶端發送數據?
- 2. 定期將數據從服務器發送到客戶端
- 3. 立即從客戶端向服務器端發送gridview數據
- 4. C#客戶端。從C#客戶端發送數據到Java服務器
- 5. Android ServerSocket不向客戶端發送數據(客戶端c#,服務器java)
- 6. iPod客戶端永久向C服務器發送數據?
- 7. 如何從java客戶端向c#web服務發送數據
- 8. 如何從客戶端向服務器發送數據流?
- 9. 客戶端向tcp服務器發送數據,tcp服務器向另一臺服務器發送數據
- 10. 從C客戶端向服務器發送字符串
- 11. 發送float數組從C++服務器到C#客戶端
- 12. 從服務器發送到客戶端
- 13. python tcp服務器向多個客戶端發送數據
- 14. 如何從CometD客戶端向CometD服務器發送參數
- 15. 如何從Python(客戶端)向Java(服務器)發送數組?
- 16. 從客戶端向服務器端發送數據 - 無效JSON PRIMITIVE:位置
- 17. 從客戶端向服務器推送/同步數據
- 18. TCP Java客戶端發送數據到C++服務器
- 19. Java服務器,C#客戶端。發送數據
- 20. 使用TCP c將數據包從服務器發送到特定客戶端#
- 21. 從C客戶端發送一個整數到Java服務器
- 22. Java套接字從客戶端發送數據到服務器
- 23. 從服務器(Java)發送數據到Android客戶端
- 24. 從服務器發送數據到客戶端?
- 25. 從服務器發送數據到客戶端上socket.io
- 26. 從服務器發送JPA數據到客戶端?
- 27. 發送數據從客戶端到服務器在春天
- 28. Java將數據從服務器發送回客戶端
- 29. 發送數據從服務器到客戶端 - ajax
- 30. 從客戶端發送ASN1數據服務器與插座
我看不出爲什麼你的程序必須是多線程的。你的解決方案似乎很合理 – 2014-12-07 17:07:56
每3秒發送一次極性信息,而不是每4秒發送一次。沒有;它不符合規範。假設你需要使用線程,使用兩個線程,一個等待三秒鐘,一個等待四秒鐘。使用互斥鎖協調對套接字的訪問,以便在12秒的倍數內,仍可以獲得理智的行爲。但是,您可以使用等待適當間隔的單線程進程完成所有操作。發送兩者之後,它會睡3,發送GPS,睡1,發送極性,睡2,發送GPS,睡2,發送極性,睡1,發送GPS,睡3,發送兩者。 – 2014-12-07 17:08:09
'send'可能不會一次發送所有數據,因此您需要在每個'send'周圍進行循環。 – alain 2014-12-07 17:08:41