非阻塞模式開發,6K進展

本來一直想在阻塞模式下碼一個能夠互相聊天的工具出來,

後來看了非阻塞模式的概念才知道,用阻塞模式開發互動的聊天工具是不方便的。

假設你的服務器要等待用戶輸入,然後將消息發送給客戶端,

這時候send()進程就會一直等待你的輸入然後發送,這時候線程就阻塞了,

如果客戶端此時給你發消息,你處於阻塞狀態,客戶端就會報錯,

服務器沒法收到這個信息,聊天也就不從談起。

 

非阻塞模式開發中講,要用多線程的思想來解決這個問題,

將新建的socket使用函數(如ioctlsocket(SOCKET))將你新建的套接字轉換成非阻塞模式,

這時候,如果你使用一個recv或者send函數的時候,socket會不斷的嘗試recv和send,

不成功就返回一個WSAEWOULDBLOCK,然後繼續嘗試;

成功之後就會接受或者發送出數據。

如果你創建了兩個線程,一個接收,一個發送,都在不停的嘗試收發數據,

就可以實現實時聊天,

當時中間還有很多多線程技術細節需要實現,

書中的實例用了一個類,CClient,還有一些句柄、CreateThread()函數等功能我還不是很清楚,

暫時沒能讀懂那個例子,當然代碼一直在敲,書中代碼是一段一段的不完整,有些東西需要你自己補充,

讓我有時候編起來有點迷茫,今天爭取把客戶端敲完了,然後改改錯,試着把客戶端的原理理解了。

 

今天積累一點小知識,

1.socket報錯的時候,SOCKET_ERROR我發現是socket已經new好了之後纔會報這個錯,

如果你是SOCKET s=socket(2,SOCK_STREAM,0);這時候如果出錯,s的值報錯爲INVALID_SOCKET。

可能是因爲socket還沒建好,稱不上socket error吧。

2.accept函數使用的時候遇到了一點點問題,accept函數第一個參數是要用來監聽的socket,第二個參數是如果server接收了某個

client的連接請求,那麼client的地址就給了addr,也就是第二個參數,第三個參數是sockaddr_in的長度,類型是int*,

在操作的時候,第三個變量我想用(int*)sizeof(sockaddr_in),但是不行,說沒法類型轉換,

書上用了兩步,int clientLen=sizeof(sockaddr_in);

函數中第三個參數用&sockaddr_in,就可以編譯通過了。

 

這兩天師兄給我講了更多的6k的知識,還有些java的背景,

師兄是虔誠的java程序員,講起java來逸興遄飛興高采烈,

我境界不高,還體會不到java到底哪有這麼大的魅力。

師兄說,選這個課題,是因爲java有前途,是一種應用前景十分廣泛的語言,

在嵌入式領域、網絡領域都有巨大的市場,嵌入式領域以手持設備居多,java的平臺無關性,

使得你寫好了一段程序可以在任何裝有java運行環境的地方跑,這是有點,

但是platform-independent是建立在犧牲效率和內存的基礎上,

java平臺無關,所以就要求jvm平臺相關,

不同的系統裝不同的jvm,將java編譯好的class文件翻譯成本地系統、本地cpu能夠認識的指令集,

指令集有很多,每種處理器可能認識的指令集不一樣,於是jvm就有各種版本,

java犧牲了中間件的效率和主機內存,換來了平臺無關性,

爲了克服效率和內存的問題,我們設計javasoc,使用硬件實現虛擬機,

直接將.class文件通過查表翻譯成我們芯片認識的指令集,

當然我們的芯片只認識java程序,其他的東東不能跑,

這樣只要是java程序來了,不用裝虛擬機,直接可以在我們的芯片上跑。

當然僅僅有個芯片是不夠的,你給別人一個芯片,別人也不知道怎麼用,

於是我們設計soc,把整個系統都給你搭好了,將時鐘、復位、各種外設控制器都給你集成好了,放到芯片裏面,

這樣你把芯片放到板上就能夠跑。

當然前提是你得使用我們提供的java類庫,畢竟驅動總得有嘛,驅動是我們用java寫的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章