黑馬程式設計師——Java學習筆記之⑦——“網路程式設計”

u010966408發表於2014-03-30


----------- android培訓java培訓、期待與您交流! ------------


1、網路模型圖解:


2、網路通訊要素:

①IP地址:(本機預設Ip地址127.0.0.1,即本地迴環地址)不易記憶,可用主機名:localhost,封裝為InetAddress類。

②埠號:其實是一臺主機上每個應用程式的標識。沒有封裝物件,有效埠:0-65535,其中0-1024為系統佔用或保留埠。

③傳輸協議:其實是通訊規則。包括TCP和UDP兩種,其特點如下:

TCP:(打電話,實時通訊,下載) 建立連線,形成傳輸資料的通道; 在連線中進行大資料量傳輸; 通過三次握手完成連線,是可靠的; 必須建立連線,效率會稍低。

UDP:(視訊會議、網路聊天等) 將資料及源和目的封裝成資料包,不需要建立連線;每個資料包的大小限制在64k內;面向無連線,所以不可靠;不需要建立連線,速度快。

④Socket:為網路服務提供的一種機制。網路通訊通過通訊方兩端的Socket通訊,資料在Socket之間通過IO傳輸。


3、InetAddress.getLocalHost(); 用來獲取本機名和IP地址。

getHostAddress(); 用來獲取主機的IP地址。

getHostName(); 用來獲取主機名。

InetAddress.getByName( String str); 獲取某個網址的IP地址和主機名。

注意:在網上,一定能獲得別的主機的IP地址,但是不一定能獲取到別的主機上的主機名。

以下為一些獲取上述網路通訊要素的操作示例:



4、通過UDP傳輸方式傳送和接收資料:

傳送方程式設計思路和步驟:

①建立udpsocket服務(傳送端點的建立)

DatagramSocket ds = new DatagramSocket();

②提供資料,並將資料封裝到資料包中

byte[] data = "UDP Test!".getBytes();

DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.101"),10000);

③通過socket服務的傳送功能,將資料包發出去

ds.send(dp);

④關閉資源

ds.close();

程式設計示例如下:



接收方程式設計思路和步驟:

①建立udpsocket服務。通常會監聽一個埠,其實就是給這個接收端網路應用程式定義數字標識,明確該接收哪些資料,方便程式處理。

DatagramSocket ds = new DatagramSocket(10000);

②定義一個資料包,用於儲存接收到的位元組資料,並用資料包物件中的方法提取包中的資料和各種資訊。

byte[] buff = new byte[1024];

DatagramPacket dp = new DatagramPacket(buff,buff.length);

③通過socket服務的receive方法,將接收到的資料存入已定義好的資料包中。

ds.receive(dp);

④通過資料包物件的特有功能,將這些不同的資料取出。列印在控制檯上。

String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());

//int port = dp.getPort(); 得到傳送端傳送資料的埠號。

⑤關閉資源

ds.close(); 

程式設計示例如下:



5、通過TCP傳輸方式傳送和接收資料:

客戶端程式設計思路和步驟:

①建立Socket服務,並指定要連線主機的地址和埠

Socket s = new Socket("192.168.1.101",13000);

②獲取socket流中的輸出流,傳送資料

OutputStream out = s.getOutputStream();

out.write("TCP Test!".getBytes());

③傳送完資料後關閉客戶端資源。

s.close();


伺服器端程式設計思路和步驟:

①通過ServerSocket建立socket服務,並監聽一個埠

ServerSocket ss = new ServerSocket(13000);

②通過ServerSocket的accept方法,獲取連線過來的客戶端物件。

Socket s = ss.accept();//阻塞式方法,總是在等待來自客戶端的連線請求

③客戶端如果發過來資料,那麼伺服器端要使用對應的客戶端物件,並獲取到該客戶端物件的讀取流,並列印在控制檯上。

InputStream in = s.getInputStream();

byte[] buff = new byte[1024];

int len = in.read(buff);

System.out.println(new String(buff,0,len));

④關閉與客戶端的連線。注:不用關閉伺服器,因為伺服器端總是在等待客戶端連線。

s.close();


TCP傳輸協議應用示例如下:



6、在應用TCP傳輸協議,在客戶端和伺服器端互相傳送檔案時,如果將某個特定的字串(例如:“over”)作為檔案輸出流結束的標記的話,可能會發生異常。這種情況就是,如果檔案中某一行的內容就是“over”,那麼檔案傳送就會停止,這就是所說的異常情況。要解決這種情況就是,在檔案傳輸完畢後,使用shutdownOutput()關閉客戶端輸出流,相當於給流中加入了一個結束標記-1。這樣就能避免這種異常情況的發生。應用示例如下:




7、URL相關:

String getFile();  獲取此 URL 的檔名。 
  String getHost() ; 獲取此 URL 的主機名(如果適用)。 
  String getPath() ; 獲取此 URL 的路徑部分。 
  int getPort() ; 獲取此 URL 的埠號。 
String getProtocol() ; 獲取此 URL 的協議名稱。 
  String getQuery();  獲取此 URL 的查詢部分。

URLConnection conn = url.openConnection();  //建立連線,不用再定義socket了

URL應用示例如下:



----------- android培訓java培訓、期待與您交流! ------------



相關文章