Android Socket編程要點簡記

	                 //創建服務器連接
			Socket socket		=new Socket("192.168.1.1", 8080);
			//數據包裝
			OutputStream os		=socket.getOutputStream();
			OutputStreamWriter osw=new OutputStreamWriter(os);
			BufferedWriter bw	=new BufferedWriter(osw);
			//寫入數據
			bw.write("hello world!\r\n\r\n");
			//刷新發送
			bw.flush();
			
			//包裝
			InputStream is			=socket.getInputStream();
			InputStreamReader isr	=new InputStreamReader(is);
			BufferedReader br		=new BufferedReader(isr);
			String str	="";
			//循環讀取
			while ((str=br.readLine())!=null) {
				System.out.println(str);
			}
			//記得關流
			os.close();
			is.close();
			socket.close();
			/**
			 * 那些情況會關流
			 * 一般我們調用socket.close()就會關閉留,但還有其他情況也會關閉socket流
			 * 1.直接調用socket.close();
			 * 2.只要inputStream和OutputStream流有一個關閉了,則網絡連接自動關閉如(inputStream.close();和outputStream.close(););
			 * 3.在程序退出時網絡連接自動關閉
			 * 4.將socket置爲null是,虛擬機就會回收這個對象,所以也會關閉連接。
			 * 5.在Socket被新的Socket對象覆蓋也同4那樣關閉連接
			 * 
			 * Socket.isClose()可以查看Socket是否已經關閉
			 * 
			 */
			
			//用Socket.connect方法連接服務器
			Socket socket2		=new Socket();
			socket2.connect(new InetSocketAddress("192.168.1.1", 8080));
			//設置連接超時
			socket2.connect(new InetSocketAddress("192.168.1.1", 8080),5000);
			
			/**
			 * 網絡連接超時有兩種,連接超時和讀取超時
			 * 
			 * 1.只有通過 Socket.connect 方法才能指定連接超時的時間。
			 * 由於使用 connect 方法連接服務器必
			 * 須要指定IP 和端口,因此,無效的 IP 或端口將會拋出連接超時異常。 
			 * 2.在連接服務器成功後,Socket 所做的最重要的兩件事就是“接收數據”和“發送數據”,而在
			 *	接收數據時可能因爲網絡延遲、網絡阻塞等原因,客戶端一直處於等待狀態,當客戶端等待一段時
			 *	間後,如果服務器還沒有發送數據到客戶端,那麼客戶端Socket 將會拋出一個超時異常。 
			 *	我們可以通過Socket.setSoTimeout方法來設置讀取數據超時的時間。時間的單位是毫秒。這個
			 *	方法必須在讀取數據之前調用纔會生效。如果將超時時間設爲0,則不使用超時時間。也就是說,
			 *	客戶端什麼時候和服務器斷開,將完全取決於服務端程序的超時設置。如下面的代碼將讀取數據超
			 *	時時間設爲5秒。
			 * Socket socket		=new Socket();
			 * socket.setSoTimeout(5000);
			 * socket.connect(...);
			 * socket.getInputStream().read();
			 * 要注意的是不要將設置連接超時和讀取數據超時設置得太小,如果值太小,如100,可能會造
			 * 成服務器的數據還沒來得及發過來,客戶端就拋出超時異常的現象。
			 * 
			 * 
			 */
			
			//設置關閉延遲,有時候在需要關閉連接時還有數據要發就需要設置這個關閉延遲
			socket.setSoLinger(true, 30000);
			
			
			//Socket的可用選項
			//TcpNodelay發送不延遲,當數據包很小的時候會等待連接到大包上一起
			//發送出去,設置了這個就可以關閉這個功能,立刻發送出去不延遲
			socket.setTcpNoDelay(true);
			//so_reuseaddr設置這個可以使多個Socket對象綁在同一個端口上
			socket.setReuseAddress(true);
			//so_timeout讀取數據延遲
			socket.setSoTimeout(5000);
			//so_sndbuf默認情況下發送緩衝大小爲8KB,可以在這裏改這個值
			socket.getSendBufferSize();
			socket.setSendBufferSize(10*1024);
			//so_rcvbuf接收緩衝大小,默認也爲8KB
			socket.getReceiveBufferSize();
			socket.setReceiveBufferSize(10*1024);
			//so_keepalive 默認關閉,如果將這個 Socket 選項打開,客戶端 Socket 每隔一段時間(大約兩個小時)就會利用空閒的
			//連接向服務器發送一個數據包。這個數據包並沒有其他的作用,只是爲了檢測一下服務器是否仍處
			//於活動狀態。
			socket.setKeepAlive(true);
			//so_oobinline 如果這個 Socket 選項打開,可以通過 Socket 類的 sendUrgentData 方法向服務器發送一個單字
			//節的數據。這個單字節數據並不經過輸出緩衝區,而是立即發出。


廣告

      最近搞了個微信公衆號,爲各種程序員枯燥的寫碼生活添加一些生活調料,

      在等待編譯的過程看一篇美麗的圖文放鬆放鬆肌肉。希望各位看官賞臉關注一下

      公衆號:馬桶上的哲學

      讀哲名理,提升逼格



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