我的應用程序連接到設備並通過單個套接字連接發送多個命令。然後,它讀取這些基本結構的響應是如何在單個套接字上執行多個stream.writes和讀取操作
命令1
stream.write
stream.read
命令2
stream.write
流。閱讀
。 。 。
我想知道是否有更好的方法來做到這一點。我並不擔心阻塞,因爲它與其他程序運行在不同的線程上。我遇到的問題是,有時命令1的數據落在命令2的讀取中。另一件事是我收到的第一個字節對命令是唯一的。
任何幫助,將不勝感激
我的應用程序連接到設備並通過單個套接字連接發送多個命令。然後,它讀取這些基本結構的響應是如何在單個套接字上執行多個stream.writes和讀取操作
命令1
stream.write
stream.read
命令2
stream.write
流。閱讀
。 。 。
我想知道是否有更好的方法來做到這一點。我並不擔心阻塞,因爲它與其他程序運行在不同的線程上。我遇到的問題是,有時命令1的數據落在命令2的讀取中。另一件事是我收到的第一個字節對命令是唯一的。
任何幫助,將不勝感激
假設TCP - 沒有辦法保證,因爲它是發送讀取每個命令。在目標端,每條命令都可以被分割或連接到其他命令,因此您需要手動確定它們之間的邊界。
一種常用的技術是在命令前面加上它們的長度,你可以先讀取這些命令,並準確知道在下一個字節之前要讀取的字節數。在目標端,通常會有某種隊列將所有接收到的數據推送到隊列中,並且只有當存在一個或多個完全接收的命令時,纔會一次從隊列中讀取一個命令。
即使您使用單獨的線程,我也不會建議在任何情況下都使用阻塞套接字。如果您需要在同一個套接字上發送和接收數據,則在沒有數據等待時您可能會遇到嘗試調用Read的問題,並且在收到一些數據之前,您將無法發送任何數據。
比使用阻塞調用相反,使用BeginRead
,EndRead
異步接收,然後你就可以發送和在同一個線程接收,而無需這些擔憂。
因爲你在多線程,使用鎖各地發送命令,如:
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..}
}
你能告訴我們的代碼? – svick