黑馬程式設計師——Java 網路程式設計
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------
一、概述
1.網路模型
網路模型常見的有ISO參考模型和TCP/IP參考模型,兩者的對應關係如下圖:
ISO參考模型分為七個層次:應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層。
TCP/IP參考模型分為四個層次:應用層、傳輸層、網際層、主機至網路層。
1)對於TCP/IP參考模型,開發人員一般處於傳輸層和網際層,web開發屬於應用層,使用者操作也屬於應用層。各層所對應的常見協議如下:
應用層:HTTP協議、FTP協議等。
傳輸層:UDP協議、TCP協議等。
網際層:IP協議等。
2)資料封包與資料拆包:
資料封包:資料在傳輸前,按照某一參考模型逐層進行封裝該層的特有標識的過程。
資料拆包:資料傳輸完後,按照某一參考模型逐層進行拆解該層的特有標識的過程。
示例:ISO參考模型的封包與拆包圖解。
2.網路通訊要素
1)IP地址:
網路裝置的標識,是IP協議提供的一種統一的地址格式,它為網際網路上的每一個網路和每一臺主機分配一個邏輯地址,以此來遮蔽實體地址的差異。
a)IP 地址是 IP 使用的 32 位或 128 位無符號數字,它是一種低階協議,UDP 和 TCP 協議都是在它的基礎上構建的。
b)IP地址是一個32位的二進位制數,通常被分割為4個“8位二進位制數”(也就是4個位元組)。IP地址通常用“點分十進位制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進位制整數。
c)每個IP地址至少對應一個或多個主機名,主機名比IP地址更容易記憶。
d)IP地址127.0.0.1為本地迴環地址,可以用於測試網絡卡,對應的主機名為localhost,主機名可以在host檔案進行修改。
IP地址在java中用InetAddress類進行描述,InetAddress有兩個子類,分別為Inet4Address和Inet6Address。
獲取InetAddress物件的方法:
a)通過給定原始IP地址獲取:
static InetAddress getByAddress(byte[] addr):該方法將IP地址的四段分別存入位元組陣列,由於位元組陣列的範圍在-128到127,如果超出127的段,則返回的為負數,使用原始IP地址時應注意修正。
b)通過主機名和IP地址獲取:
static InetAddress getByAddress(String host, byte[] addr):
c)通過主機名獲取:
static InetAddress getByName(String host):
d)直接呼叫返回本地主機:
static InetAddress getLocalHost():
e)通過主機名,返回其 IP 地址所組成的陣列:
static InetAddress[]getAllByName(String host):
注:所有獲取InetAddress物件的方法,都將丟擲UnknownHostException異常,該異常為IOException異常的子類。
InetAddress類的常用方法:
a)獲取IP地址的字串表示:
String getHostAddress():
b)獲取主機名:
String getHostName():
c)獲取InetAddress物件的原始IP地址:
byte[] getAddress():
2)埠號:
a)用於表示程序的邏輯地址。
b)埠號的範圍為0到65535,其中0到1024為系統使用或保留埠,但也可以使用,只要與系統不衝突即可。
3)傳輸協議:
傳輸協議即通訊規則,常見的協議有UDP和TCP。
二、UDP通訊
1.特點:
UDP是面向無連線的,即UDP沒有建立連線的過程,沒有傳送連線請求資料包,而是直接傳送要傳輸的資料包,因此具有連線速度快,但一次傳輸資料量較少且傳輸可靠性較低的特點,傳輸過程容易丟失資料。因此UDP特點總結如下:
1)將資料及源和目的封裝成資料包中,不需要建立連線,速度快。
2)每個資料報包的大小在限制在64k內,一次傳輸少量資料。
3)因無連線,是不可靠的協議,有可能丟失資料。
2.應用場合:
UDP適用於對傳輸速度要求較高,一次傳輸資料量不大,且可靠性要求不高的應用環境,如視訊會議、視訊
直播、桌面共享等。
3.DatagramSocket類:
此類表示用來發送和接收資料報包的套接字。資料報套接字是包投遞服務的傳送或接收點。每個在資料報套接字上傳送或接收的包都是單獨編址和路由的。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。
1)建立DatagramSocket物件:只能通過建構函式建立。
DatagramSocket():構造資料報套接字並將其繫結到本地主機上任何可用的埠。
DatagramSocket(int port):建立資料報套接字並將其繫結到本地主機上的指定埠。
DatagramSocket(int port, InetAddress laddr):建立資料報套接字,將其繫結到指定的本地地址。
DatagramSocket(SocketAddress bindaddr): 建立資料報套接字,將其繫結到指定的本地套接字地址。
2)常用方法:
void send(DatagramPacket p):從此套接字傳送資料報包。
void receive(DatagramPacket p);從此套接字接收資料報包。
InetAddress getInetAddress():返回此套接字連線的地址。
int getPort():返回此套接字的埠。
void connect(InetAddress address, int port):將套接字連線到此套接字的遠端地址。
void connect(SocketAddress addr):將此套接字連線到遠端套接字地址(IP 地址 + 埠號)。
void close():關閉此資料報套接字。
注:更多方法參見API文件。
4.DatagramPacket類:
此類表示資料報包。資料報包用來實現無連線包投遞服務。每條報文僅根據該包中包含的資訊從一臺機器路由到另一臺機器。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。
1)建立DatagramPacket物件:
DatagramPacket(byte[] buf, int length):
DatagramPacket(byte[] buf, int length, InetAddress address, int port):
DatagramPacket(byte[] buf, int length, SocketAddress address):
2)常用的方法:
InetAddress getAddress():返回某臺機器的 IP 地址,此資料報將要發往該機器或者是從該機器接收到的。
byte[] getData():返回資料緩衝區。
int getLength(): 返回將要傳送或接收到的資料的長度。
int getPort():返回某臺遠端主機的埠號,此資料報將要發往該主機或者是從該主機接收到的。
SocketAddress getSocketAddress():獲取要將此包傳送到的或發出此資料報的遠端主機的 SocketAddress(通常為 IP 地址 + 埠號)。
注:更多方法參見API文件。
5.UDP傳輸:
1)UDP傳送端的建立步驟:
a)建立DatagramSocket服務,可指定傳送端的埠。
b)將要傳送的資料封包,封包的類為DatagramPacket,且需要指定目標IP物件和目標埠以及封裝的資料和長度。
c)利用DatagramSocket服務的send方法將資料包傳送出去。
d)關閉資源。
2)UDP接收端的建立步驟:
a)建立DatagramSocket服務,並指定埠,以接收發送端發來的資料。
b)定義一個數據包,用來儲存接收來的資料。
c)通過DatagramSocket服務的receive方法將資料儲存到所定義的資料包中。
d)利用資料包物件的更多功能實現對接收資料的不同操作。
e)關閉資源。
3)程式碼示例:
//定義UDP傳送端
import java.net.*;
class UdpSend
{
public static void main(String[] args) throws Exception
{
//建立傳送端Socket服務,並指定傳送端程式的埠為8888
//如果不指定埠,則系統會自行分配
DatagramSocket ds=new DatagramSocket(8888);
//定義要一個位元組陣列,用來儲存要傳送的資料
byte[] buf="hello UdpRece".getBytes();
//將要傳送的資料封包,並指定目標主機IP物件和目標埠
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
//通過Socket服務中的send方法將資料包傳送出去
ds.send(dp);
//關閉資源
ds.close();
}
}
//定義UDP接收端
class UdpRece
{
public static void main(String[] args) throws Exception
{
//建立傳送端Socket服務,並指定接收端程式的埠為10000
DatagramSocket ds=new DatagramSocket(10000);
//定義要一個位元組陣列
byte[] buf=new byte[1024];
//定義一個數據包,用來儲存要接受的資料
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//通過接收端Socket服務中的receive方法將資料儲存到所定義的資料包中
ds.receive(dp);
//獲取傳送端主機IP物件,並通過該物件獲取傳送端主機地址
String ip=dp.getAddress().getHostAddress();
//獲取接收的資料內容
byte[] data=dp.getData();
//獲取傳送端主機程式埠
int port=dp.getPort();
//列印獲取的資料到控制檯
//獲取列印資料的實際長度為getLength方法
System.out.println(ip+"--"+(new String(data,0,dp.getLength()))+"--"+port);
//關閉資源
ds.close();
}
}
6.程式碼練習:
練習1:UDP傳送端通過鍵盤錄入的方式向UDP接收端傳送資料。
<pre name="code" class="java">import java.net.*;
import java.io.*;
class UdpSend
{
public static void main(String[] args)
{
DatagramSocket ds=null;
BufferedReader bufr=null;
try
{
ds=new DatagramSocket();
bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
if (line.equals("over"))
{
break;
}
byte[] buf=line.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.90.31"),10002);
ds.send(dp);
}
}
//SocketException異常為IOException異常的子類
catch(SocketException ex)
{
System.out.println("Socket異常:"+ex.toString());
}
catch (IOException e)
{
System.out.println("IO異常:"+e.toString());
}
finally
{
if (bufr!=null)
{
try
{
bufr.close();
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
ds.close();
}
}
}
class UdpRece
{
public static void main(String[] args)
{
DatagramSocket ds=null;
try
{
ds=new DatagramSocket(10002);
while (true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);//丟擲了IOException異常
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"--"+data);
}
}
catch (SocketException e)
{
throw new RuntimeException("Socket服務建立失敗");
}
catch (IOException ex)
{
throw new RuntimeException("接受資料異常");
}
finally
{
ds.close();
}
}
}
練習2:UDP傳送端與接收端互相通訊。
<pre name="code" class="java">//定義UDP傳送端
import java.net.*;
class UdpSend3
{
public static void main(String[] args) throws Exception
{
//向UDP接收端傳送資料包
DatagramSocket ds=new DatagramSocket(8888);
byte[] buf="hello UdpRece".getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.90.36"),10000);
ds.send(dp);
//接收UDP傳送端傳送的資料包
buf=new byte[1024];
DatagramPacket dps=new DatagramPacket(buf,buf.length);
ds.receive(dps);
String ip=dps.getAddress().getHostAddress();
byte[] data=dps.getData();
int port=dps.getPort();
System.out.println(ip+"--"+(new String(data,0,dps.getLength()))+"--"+port);
//關閉資源
ds.close();
}
}
//定義UDP接收端
class UdpRece3
{
public static void main(String[] args) throws Exception
{
//接收UDP傳送端傳送的資料包
DatagramSocket ds=new DatagramSocket(10000);
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
byte[] data=dp.getData();
int port=dp.getPort();
System.out.println(ip+"--"+(new String(data,0,dp.getLength()))+"--"+port);
//向UDP傳送端返回資料包
buf="hello UdpSend".getBytes();
DatagramPacket dpr=new DatagramPacket(buf,buf.length,dp.getAddress(),dp.getPort());
ds.send(dpr);
//關閉資源
ds.close();
}
}
三、TCP通訊
1.特點:
TCP是面向有連線的,即TCP在傳送資料之前,會先發送連線請求資料包,通過三次握手建立起連線,然後再進行資料的傳送,因此具有傳輸可靠性強,一次傳輸資料量大的特點,但由於需要建立連線,傳輸速度稍慢。因此TCP的特點總結如下:
1)建立連線,形成傳輸資料的通道。
2)在連線中進行大資料傳輸。
3)通過三次握手完成連線,是可靠協議。
4)因為必須建立連線,所以效率會稍低,速度稍慢。
2.應用場合:
TCP通訊適用於對傳輸速度要求不高,但一次傳輸資料量較大,且可要性要求很高的應用場合,如資料下載、檔案傳輸等。
3.Socket類:
此類實現客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機器間通訊的端點。
1)建立Socket物件的常見構造方法:
Socket(InetAddress address, int port):建立一個流套接字並將其連線到指定 IP 地址的指定埠號。
Socket(String host, int port):建立一個流套接字並將其連線到指定主機上的指定埠號。
2)常用方法:
InputStream getInputStream():返回此套接字的輸入流。
OutputStream getOutputStream():返回此套接字的輸出流。
void shutdownInput(): 此套接字的輸入流置於“流的末尾”。
void shutdownOutput():禁用此套接字的輸出流。
InetAddress getInetAddress():返回套接字連線的地址。
int getPort():返回此套接字連線到的遠端埠。
void close():關閉此套接字。
注:更多方法參見API文件。
4.ServerSocket類:
此類實現伺服器套接字。伺服器套接字等待請求通過網路傳入。它基於該請求執行某些操作,然後可能向請求者返回結果。
1)建立ServerSocket物件的常見構造方法:
ServerSocket(int port): 建立繫結到特定埠的伺服器套接字。
ServerSocket(int port, int backlog):利用指定的 backlog 建立伺服器套接字並將其繫結到指定的本地埠號。
2)常見的方法:
Socket accept():偵聽並接受到此套接字的連線。
InetAddress getInetAddress():返回此伺服器套接字的本地地址。
void close(): 關閉此套接字。
注:更多方法參見API文件。
5.TCP傳輸:
1)TCP客戶端的建立步驟:
a)建立Socket服務,並指定連線的主機和埠。
b)獲取鍵盤錄入或讀取硬碟檔案資料。
c)獲取Socket輸出流,將資料傳送給服務端。
d)獲取Socket讀取流,讀取服務度返回的資料。
e)關閉資源。
-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------
一、概述
1.網路模型
網路模型常見的有ISO參考模型和TCP/IP參考模型,兩者的對應關係如下圖:
ISO參考模型分為七個層次:應用層、表示層、
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">
------- android培訓、java培訓、期待與您交流! ----------
TCP網路傳輸。
客戶端和服務端,分別對應著兩個物件。
Scoket(客戶端)和ServerSocket(服務端)。
Socket(String address, int po
----------------------
ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
這部分的知識點主要有:
1.TCP傳輸的幾個應用;
2.瀏覽器訪問伺服器。
一、TCP傳輸的幾個應用
----------------------
ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
這部分的主要知識點:
1.網路程式設計概述;
2.UDP傳輸;
3.TCP傳輸。
一、網路程式設計概述
------ android培訓、java培訓、期待與您交流!
----------
一、GUI視覺化程式設計
1. GUI視覺化程式設計是什麼?
就是讓介
-------
android培訓、java培訓、期待與您交流! ----------
GUI
如何建立一個視窗並顯示
Graphical User Interface(圖形使用者介面)。
------- android培訓、java培訓、期待與您交流! ----------
-Java面向物件程式設計知識點總結。
一:內部類。
將一個類定義在另一個類的裡面,就稱該類為內部類。
1.內部類的特點:1.內部類可以直接訪問外部類的成員,包括私有成員。
----------------------
ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------面向物件:以前學習過C語言,C語言是面向過程,裡面功能的實現都是由呼叫一個個的函式來完成的,而java是面向物件的程式語
----------------------
ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------- 繼承:
在java中,在我們要對一個事物進行封裝時,發現有某一個類的特性和要封裝的這個
類的特性相同,而我們可以在這個
----------------------
ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------
一.圖形使用者介面
GUI:Graphical User Interface(圖形使用者介面)
CLI:Comman
----------------------
ASP.Net+Unity開發、.Net培訓、期待與您交流! ----------------------Java程式設計基礎
java程式的註釋:
根據不同的功能,分三種:
1、單行註釋比如:int num = 10;//定
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g 相關推薦
黑馬程式設計師——Java 網路程式設計
黑馬程式設計師之 --- 網路程式設計
黑馬程式設計師_網路程式設計TCP之學習筆記
黑馬程式設計師-JAVA高階(網路程式設計)PART2
黑馬程式設計師-JAVA高階(網路程式設計)PART1
黑馬程式設計師----JAVA基礎之GUI視覺化程式設計與列舉&網路程式設計
黑馬程式設計師--Java學習日記之GUI&網路程式設計
黑馬程式設計師—Java程式設計異常知識總結
黑馬程式設計師 java程式設計之面向物件學習筆記
黑馬程式設計師 java程式設計之面向物件學習筆記總結
黑馬程式設計師 java基礎24天 GUI程式設計學習總結
黑馬程式設計師 java程式設計基礎知識筆記
黑馬程式設計師----Java基礎之反射
黑馬程式設計師----Java基礎之GUI
黑馬程式設計師----Java基礎之IO包中其它類
黑馬程式設計師----Java基礎基礎之IO流
黑馬程式設計師----Java基礎之集合類(一)
黑馬程式設計師----Java基礎之String類
黑馬程式設計師----Java基礎之多執行緒
黑馬程式設計師----Java基礎之面向物件(最終篇)