[英]How can I read from a socket repeatedly?
開始我用C#編碼。 我通過套接字將不同大小的數據寫入設備。 在寫入我想要從套接字讀取的數據之后,因為一旦完成處理所有數據,設備將回寫錯誤代碼/完成消息。 目前我有這樣的事情:
byte[] resultErrorCode = new byte[1];
resultErrorCode[0] = 255;
while (resultErrorCode[0] == 255)
{
try
{
ReadFromSocket(ref resultErrorCode);
}
catch (Exception)
{
}
}
Console.WriteLine(ErrorList[resultErrorCode[0] - 48]);
我在其他地方使用ReadFromSocket
,所以我知道它工作正常。 最終發生的事情是我連接的端口(在我的機器上)更改為隨機端口。 我認為這會導致另一方的固件連接不良。 因此,當我在另一側寫入數據時,它會嘗試將數據寫入我連接的原始端口,但在嘗試多次讀取后,連接端口就會發生變化。
在收到完成命令之前,如何連續讀取套接字? 如果我知道循環有問題,因為對於我最小的測試文件,它需要1分13秒非常一致。 我通過刪除循環並將代碼置於休眠狀態1分15秒來測試代碼。 當它恢復時,它成功讀取了我期待的完成命令。 有人有建議嗎?
你應該擁有的是一個單獨的線程,它將像你的外部硬件的驅動程序。 該線程將接收所有數據,解析它並將適當的消息傳輸到應用程序的其余部分。 這部分代碼將讓您了解如何從硬件接收和解析數據。
public void ContinuousReceive(){
byte[] buffer = new byte[1024];
bool terminationCodeReceived = false;
while(!terminationCodeReceived){
try{
if(server.Receive(buffer)>0){
// We got something
// Parse the received data and check if the termination code
// is received or not
}
}catch (SocketException e){
Console.WriteLine("Oops! Something bad happened:" + e.Message);
}
}
}
筆記:
Thread.Sleep
並不是一個好主意。 如果可能,您應該使用事件(在RS232連接的情況下)或在單獨的線程上阻塞調用,如上面的代碼中的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.