我有個上位機,一邊收資料,一邊要轉發資料。遇到一些奇怪的問題,請大神幫忙解惑。
1.我的程式創建兩個socket 監聽兩個埠,把收到的資料發送到對應的頁面顯示,一切都很正常也很流暢。頁面顯示的時候差不多也是一秒顯示一條記錄,我有個按鈕是停止接收,具體操作就是原來收的資料通過委托去發送到頁面顯示,當點停止時,把委托解綁,頁面就收不到資料顯示,過一會兒我重新系結委托,我就發現資料會超快的顯示。不知道這是個什么原理?
2.我后來增加了個需求,就是把埠收到的資料 要發送到別的機器上,我創建兩個SOCKET客戶端,當接收埠收到資料時,就呼叫Socket客戶端用Send發送,之前和別人聯調時還好好的,過了一陣子我們再次聯調發現資料發不出去,用抓包工具看,好象是沒發出來,但我除錯顯示send方法有回傳值回來。后來在send 方法加了SocketFlag.None,就發出去了。接著聯調,似乎我的程式沒什么問題。第三次聯調,不知道對方是不是做了什么改變,我只要啟動Send 后,一會兒我的程式接收端資料就過不來了,感覺被堵住了。我停止send 后,一會接收的資料就過來了。不知道這是什么情況,能分析一下嗎?
3.我把send方法改成sendAsync后,好象接收的資料能正常過來,但沒多久我的程式就報MEMEYOUTEXCEPTION,這是不是每次呼叫sendAsync,都會開執行緒導致的呢?后來,我又嘗試,用佇列接收資料,用Send(byte,SocketFlag.None)然后在主頁面開一個執行緒不斷的去執行,如果佇列數超過N條,我就照樣從佇列取資料,但不呼叫Send(byte,SocketFlag.None), 也就是我允許自己丟棄一部分資料了,現在情況好象沒什么問題了,整個程序有點懵逼!
uj5u.com熱心網友回復:
https://blog.51cto.com/walkerqt/1947585關于轉發,我們可以不用寫代碼直接轉發。因為其實我其實根本就不想討論你上面的東西.
因為現在環境早已變化,上面那種討論可以停止了。 如果我們說我們只需封裝一個SocketTransport
https://github.com/rsocket/rsocket-net/blob/master/RSocket.Core/Transports/SocketTransport.cs
然后把兩個Tranfer的IDuplexPipe 介面之間互相掛接一下就好
uj5u.com熱心網友回復:
同步阻塞一般是給臨時寫個練習時用的。盡量使用異步多執行緒方式處理收發。uj5u.com熱心網友回復:
同步阻塞的時候,你的類似var len = xxxx.Receive(buffer);這類陳述句往往會阻塞你的主執行緒,你的程式“邏輯短路”了,自己讓自己懵逼。
uj5u.com熱心網友回復:
這個receive 我是新開的執行緒不會阻塞主執行緒的
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/234093.html
標籤:C#
