抬槓(非同步套接字和二進位制XML亂彈)

2022-01-31 04:47:47 字數 2359 閱讀 3027

抬槓(非同步套接字和二進位制xml亂彈)

都說我愛抬槓。「說你啥都不聽,說你你還犟,說什麼你都不服,你要老這樣,肯定要吃虧的。」類似的話不止乙個人一次說過我。這不,上次又和同事爭論起來了,很久沒有和人爭論什麼了,其實我感覺討論個技術問題,不至於搞的這麼面紅耳赤吧,現在不像以前了,一般我我都不愛爭論下去了。不過這樣的事老發生在我身上,確實有我的問題,也許就是我思路不清晰,表達不清楚吧,討論的問題容易讓人不知道問什麼。是該多鍛鍊鍛鍊這方面的能力了。

其實,頭一天討論的是非同步套接字的問題。我剛開始沒有詳細看過底層關於windows socket的資料,只了解dotnet下的system.net.socket命名空間下的幾個類。msdn裡說的非同步套接字(服務端套接字和客戶端套接字)都是通過不同的執行緒來實現的。具體文字描述如下:

若要在執行過程中使用單獨的執行緒處理通訊,請使用下面的方法,這些方法適用於非同步操作模式。

如果當前使用的是面向連線的協議(如 tcp),則可使用 socket、beginconnect 和 endconnect 方法來連線偵聽主機。通過使用 beginsend 和 endsend 方法,或者使用 beginreceive 和 endreceive 方法,可以進行非同步資料通訊。可以使用 beginaccept 和 endaccept 處理傳入的連線請求。

我來說說我的理解哦:拿連線主機的操作來說吧,我認為的就是就是主線程呼叫beginconnect()方法,然後主線程不阻塞直接執行下面的語句,而系統會自動啟動乙個執行緒去執行**方法,而這個**方法會呼叫endsend()方法一直阻塞到連線上對方的主機。等連線上主機的時候可以呼叫manualresetevent.set方法通知主線程已經連線上主機可以傳送資料了,或者在**裡endsend()方法後執行傳送資料等操作。一直以為這種方式就算是非同步socket了。

後來,同事給我們培訓socket的時候說sendto和receivefrom這類的方法才是非阻塞模式,也就是非同步模式(我理解的意思哦,別人怎麼理解我也不知道了)。說這兩個方法執行的時候(sendto)就算資料沒有傳送完畢或者(receivefrom)如果沒有資料要接受直接就往下執行,而不是像同步socket那樣阻塞在那裡(send)等待資料傳送完畢或者(receive)等待有可接受的資料。說非同步模式利用了windows的訊息機制,當資料傳送完畢或者有資料傳送來要接受的時候會引發乙個訊息,只要訊息來了,根據訊息型別進行不同的操作就可以了。

同事說的這些,我沒有異議,我感覺他說的處理訊息和.net裡處理**函式是一樣的。我感覺.net那樣也是非同步套接字。可能.net裡的阻塞說的是執行緒的阻塞,他說的是埠的阻塞。用receive的時候埠阻塞住了,而用receivefrom的時候如果沒有可接受的資料直接就執行下面的語句了。其實我完全沒有反對同事的說法,可我就感覺(只是感覺).net下面用執行緒實現的不影響主線程執行其它操作的方法也算是非同步,可能我們爭論的同步非同步不是一回事吧,此非同步非彼非同步?

第二個爭論的問題是,文字轉換成二進位制會不會變大。是這樣的,一般介紹web服務的地方都會提到web服務的乙個缺點,就是效能問題,因為web服務傳遞的是xml,而xml是文字表示的,不如傳遞二進位製快。後來w3c不是又起草了個二進位制xml嗎?我就想問個問題,這文字轉換成二進位制是不是就變小了,傳輸起來效能就好了呢。同事說,其實文字在底層儲存和傳輸的時候都是二進位制的,都是0和1,都是電流,我暈,跟我說這個。又跟我說,web服務是http的http本身就是建立底層socket上的,它本身有一些頭資訊,以及soap本身封裝的時候也有一些包裝資料,所以web服務慢。當然,是我沒有說明確我問的問題的限制條件,我應該加上,不考慮http頭,不考慮soap的包裝資訊,單純說用web服務傳遞一段xml和socket傳遞一段xml有什麼區別?就是截包的話,同樣的文字,如果用http傳遞,和用socket傳遞,他們的二進位制資訊應該是相同的呀,ansi碼是一樣的呀(假如是ansi編碼哦),我就怪了,為什麼大家都說文字傳輸慢,二進位制傳輸快呢。其實我就是納這個悶,完了,我又被數落上了,說我白聽了它的培訓,搞不清楚文字在記憶體裡,在網路流裡就是二進位制,就是0和1,所以才會提這個問題。其實他反駁的我說的話,我都沒有反對意見,都對,我知道對文字進行getbytes(str)方法返回的也是位元組流,大小肯定是一樣的。其實這不叫把文字轉換成二進位制,這文字就是二進位制。那人們說的傳輸文字比較慢,傳輸二進位制比較快,我感覺是格式的問題,因為把一段資料序列化成xml儲存下來或者傳輸,和序列化成二進位制儲存下來或傳輸肯定大,所以說文字慢,二進位製快,可文字它也是二進位制呀,我暈,我不知道怎麼說才能表達。那我猜測w3c的二進位制xml,也許是把xml壓縮了一下,壓縮成二進位制了,人眼不能直接看了,這才是真正的把文字轉換成二進位制,這才是提高效能,只是猜測一下哦,因為我感覺文字本來就可以大幅度壓縮的,這樣減少網路壓力,而傳遞和接受方都用共同的壓縮解壓縮演算法的話,兩邊也可以實現透明傳輸。

算了,不羅嗦了,我也忘了最初讓我疑惑的是什麼問題了,看電視看的突然又想起來這件事,隨手就寫了兩句。以後這種無聊的討論,我盡量不張口了,要真正深入了解了再和大家討論,我就缺乏一種謙虛低調的態度吧。

xml轉二進位制

1.獲得選中的要轉換的類名,然後反射物件反序列化該型別用於xml反序列化 2.經過1得到了物件,然後使用序列化工具類反序列化為二進位制 xml轉二進位制 序列化工具類,請看文章 public class dataeditor assetdatabase.refresh editorutility.c...

非同步獲取遠端二進位制資料

using system using system.net using system.threading using system.text using system.io using system.drawing 非同步獲取遠端二進位制資料 王保巨集 2006 2 28 namespace rdp...

xml 中的二進位制資料

本文是為zdnet翻譯的系列文章之一,原文已經發表在zdnet xml通常是用來描述文字資料的方法,例如元素本身給出文字的名稱,而元素的內容通常是基於文字的。然而有時候你也會遇到想將非文字的資料放到xml文件中的情況。讓我們檢查一下你可能使用的幾種方法。問題你可能想你只需要放置一些二進位制資料到開始...