本來一直想在阻塞模式下碼一個能夠互相聊天的工具出來,
後來看了非阻塞模式的概念才知道,用阻塞模式開發互動的聊天工具是不方便的。
假設你的服務器要等待用戶輸入,然後將消息發送給客戶端,
這時候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寫的。