1. 程式人生 > >(轉載)華為2015屆面試經歷

(轉載)華為2015屆面試經歷

到這裡,他說,基本問完了,問我還有什麼問題沒有?我剛準備說,他說對了,講一下你那個WebSocket聊天室(PS:華為公司是搞通訊的,很多員工都用的C/C++進行網路程式設計,所以應該要認真複習網路程式設計,還有各種協議)。我開始講:WebSocket和傳統的Socket程式設計,有所不同,傳統的Socket是要編寫一個客戶端和伺服器端應用程式,進行端對端的通訊。而WebSocket的客戶端只需要有一個瀏覽器(必須支援HTML5),就可以直接將瀏覽器作為Socket客戶端用,伺服器端直接用Apache的Web伺服器如Tomcat或者JBoss的那些實現了Websocket協議的版本作為容器。 這樣我們就將傳統的C/S架構改成了B/S的架構,很方便。接著我說為什麼我做聊天室要用到這個,因為我以前也做過AJAX聊天室,各個客戶端採用輪詢的方式定時地向伺服器傳送HTTP請求,讓伺服器去查詢資料庫,是否有新的聊天記錄產生,若有的話,將HTTP響應的資料顯示在聊天視窗中。但這樣做,會給伺服器帶來很大負載,即使很長時間沒有新訊息,但是每個客戶端還是定時請求,這就對伺服器資源產生了很大浪費。現在有了WebSocket,每個客戶端瀏覽器都和伺服器Tomcat建立了一個Socket連線,那麼我們就可以實現客戶端和伺服器端的全雙工通訊,一旦有一個客戶端發訊息,伺服器監聽到以後呢,就可以對通過遍歷存在伺服器端的HashMap<User,Socket>中的所有Socket連線,通過每個Socket廣播給所有客戶端。接下來,我講了一下Websocket的原理:WebSocket是在Http請求的時候,在Http報文中加入瞭如下報文:upgrade:websocket ;  connection:upgrade。key:XXX。告訴伺服器的Servlet(一種特殊的Servlet,繼承自WebSocketServlet),要求協議升級到WebSocket,伺服器收到這個特殊的HTTP報文段,經過對key進行Hash以後,返回給客戶端,表示升級成功,同意建立Socket連線(這樣應用層兩次握手就完了,這和傳輸層TCP的三次握手不在一個層面),這樣雙方就可以進行全雙工
的通訊。他感覺我講的還不錯,就開始問我傳統的Socket怎麼實現聊天。我說伺服器端用ServerSocket ss=new ServerSocket(Port);監聽某個埠,然後while(true){Socket s=ss.accept();}時刻可以接受客戶端的Socket請求。然後客戶端Socket s=new Socket(String IP,String port),底層呼叫connet()方法像伺服器請求Soket連線,經過三次握手成功以後就建立了Socket連線。這樣,客戶端和伺服器端就可以通過網路流進行資料傳輸。說到這裡,他提出一個問題:假如客戶端A向伺服器傳送a資料,若要再發送b資料之前,必須確認伺服器收到資料,並且收到伺服器響應以後才能發b資料,請問你怎麼實現
?我說我用的基於TCP的Socket,TCP本身就是可靠傳輸的,有資料重傳機制,能保證伺服器收到資料。他說不對,那是傳輸層的問題,現在討論的是應用層的問題,你怎麼能知道伺服器端Socket收到訊息沒?我說客戶端能不能再發送a以後開始一直在read,如果沒有讀到資料就不發b,感覺還是講的不清楚,真不知道怎麼回答了。他讓我再回去好好想想。他有看了看我的簡歷,說學過C語言沒?我說大一的時候學過,有五六年時間了,現在都忘得差不多了,我主要從事的還是Java開發。呵呵,他笑了一下,說他問完了,問我有木有什麼問題?我就隨便問了一下如果華為決定錄用我,能不能讓我選擇我感興趣的職位,我想從事比如網路程式設計方面的東西。他一笑,說這個你如果籤協議時候再說吧。