2011-07-23 64 views
0

我的應用程序連接到設備並通過單個套接字連接發送多個命令。然後,它讀取這些基本結構的響應是如何在單個套接字上執行多個stream.writes和讀取操作

命令1

stream.write

stream.read

命令2

stream.write

流。閱讀

。 。 。

我想知道是否有更好的方法來做到這一點。我並不擔心阻塞,因爲它與其他程序運行在不同的線程上。我遇到的問題是,有時命令1的數據落在命令2的讀取中。另一件事是我收到的第一個字節對命令是唯一的。

任何幫助,將不勝感激

+0

你能告訴我們的代碼? – svick

回答

0

假設TCP - 沒有辦法保證,因爲它是發送讀取每個命令。在目標端,每條命令都可以被分割或連接到其他命令,因此您需要手動確定它們之間的邊界。

一種常用的技術是在命令前面加上它們的長度,你可以先讀取這些命令,並準確知道在下一個字節之前要讀取的字節數。在目標端,通常會有某種隊列將所有接收到的數據推送到隊列中,並且只有當存在一個或多個完全接收的命令時,纔會一次從隊列中讀取一個命令。

即使您使用單獨的線程,我也不會建議在任何情況下都使用阻塞套接字。如果您需要在同一個套接字上發送和接收數據,則在沒有數據等待時您可能會遇到嘗試調用Read的問題,並且在收到一些數據之前,您將無法發送任何數據。

比使用阻塞調用相反,使用BeginReadEndRead異步接收,然後你就可以發送和在同一個線程接收,而無需這些擔憂。

0

因爲你在多線程,使用鎖各地發送命令,如:

public void SendCommand(Command command) 
{ 
    lock (_commandLocker) 
    { 
     stream write 
     stream read 
    } 
} 

所以在時間只有一個命令發送和接收數據。

但是,如果從設備在任何時間接收數據「也許它發出了一個通知。」然後再考慮做這樣的事情:

private Queue<Notification> _notificationsBuffer = new Queue<Notification>();//Or use BlockingCollection if your are using 4.0 

SendCommand

... 
while (stream read) 
{ 
    if (this is a notification) 
    { 
    then add it to the notification buffer and continue read 
    continue; 
    } 
    else (this is our command) 
    { ... read the response..} 
} 
相關問題