分類  >  Web前端 >

Java-WebSocket 項目的研究(3) WebSocketClient 類 詳解

tags:    時間:2014-05-04 12:06:16
Java-WebSocket 項目的研究(三) WebSocketClient 類 詳解
通過之前兩篇文章

Java-WebSocket 項目的研究(一) Java-WebSocket類圖描述


Java-WebSocket 項目的研究(二) 小試身手:客戶端連接伺服器併發送消息實例

的介紹我們大概了解到了整個項目的類結構,其中有一個重要的類:WebSocketClient,下面就讓我們詳細了解一下這個類


首先看一下我們之前的類圖關於WebSocketClient的描述,可以看出:

1.繼承自WebSocketAdapter

2.依賴於類WebSocketImpl(實際上關於WebSocket核心代碼都在類WebSocketImpl里)

3.實現了WebSocket介面(實際上通過類WebSocketImpl實現的)


很簡單的,從字面意思我們就大概能猜到WebSocketAdapter是適配器類,架起了WebSocketImplWebSocketClient之間的橋樑,WebSocketImpl是web implementation的縮寫,意思就是真正實現了websocket里主要的功能。


然後我們看一下WebSocketClient的幾個主要方法:

首先是connect方法

/** 	 * Initiates the websocket connection. This method does not block. 	 */ 	public void connect() { 		if( writeThread != null ) 			throw new IllegalStateException( "WebSocketClient objects are not reuseable" ); 		writeThread = new Thread( this ); 		writeThread.start(); 	} 

我們可以發現:

他其實是起了一個線程,由於WebSocketClient類實現了Runnable介面,因此他會自動去調用run方法,然後我們進一步到run方法里去一探究竟

public void run() { 		try { 			if( socket == null ) { 				socket = new Socket( proxy ); 			} else if( socket.isClosed() ) { 				throw new IOException(); 			} 			System.out.println("---->  "+uri.toString()+"   port: "+getPort() ); 			if( !socket.isBound() ) 				socket.connect( new InetSocketAddress( uri.getHost(), getPort() ), connectTimeout ); 			istream = socket.getInputStream(); 			ostream = socket.getOutputStream();  			sendHandshake(); 		} catch ( /*IOException | SecurityException | UnresolvedAddressException | InvalidHandshakeException | ClosedByInterruptException | SocketTimeoutException */Exception e ) { 			onWebsocketError( engine, e ); 			engine.closeConnection( CloseFrame.NEVER_CONNECTED, e.getMessage() ); 			return; 		}  		writeThread = new Thread( new WebsocketWriteThread() ); 		writeThread.start();  		byte[] rawbuffer = new byte[ WebSocketImpl.RCVBUF ]; 		int readBytes;  		try { 			while ( !isClosed() && ( readBytes = istream.read( rawbuffer ) ) != -1 ) { 				engine.decode( ByteBuffer.wrap( rawbuffer, 0, readBytes ) ); 			} 			engine.eot(); 		} catch ( IOException e ) { 			engine.eot(); 		} catch ( RuntimeException e ) { 			// this catch case covers internal errors only and indicates a bug in this websocket implementation 			onError( e ); 			engine.closeConnection( CloseFrame.ABNORMAL_CLOSE, e.getMessage() ); 		} 		assert ( socket.isClosed() ); 	} 


下面我們對上面的代碼進行詳細研究:

				socket = new Socket( proxy ); 

這句顯而易見,是創建了一個socket套接字。

				socket.connect( new InetSocketAddress( uri.getHost(), getPort() ), connectTimeout ); 

這句的意思是創建連接,參數就是伺服器地址,埠號,超時時間。

			istream = socket.getInputStream(); 

是接受伺服器端的數據,關於接受的詳細過程,我會在後期的博客中闡述,敬請期待。

			ostream = socket.getOutputStream(); 

是發送數據用的。

其他的先不解釋,我們繼續之前的流程------connect之後就要發送信息,也就是調用send方法,send方法如下:

/** 	 * Sends <var>text</var> to the connected websocket server. 	 *  	 * @param text 	 *            The string which will be transmitted. 	 */ 	public void send( String text ) throws NotYetConnectedException { 		engine.send( text ); 	}

它調用了engine的send方法,那麼engine是啥東東呢,在類的聲明處有這麼一句話:

	private WebSocketImpl engine = null; 

說明了WebSocketImpl類實現了send的操作。


完。。。




推薦閱讀文章

Bookmark the permalink ,來源:互聯網