1、 網絡編程的三要素:IP地址:InetAddress、端口號、傳輸協議
要實現網絡通訊:
1. 找到對方 IP
2. 數據要發送到對方指定的應用程序上。爲了標識這些應用程序,所以給這些網絡應用程序都用數字進行標識,爲了方便稱呼這個數字,叫做端口。指的是邏輯端口
3. 定義通訊規則,這個規則稱爲協議。
國際組織了通用協議TCP/IP。
2、 IP地址:InetAddress
四段組成,每一段都是一個字節,一個字節取值範圍0~255
新段地址IP/V6,6段組成
本地迴環地址:127.0.0.1 主機名:localhost
3、 端口號
用於標識進程的邏輯地址,不同進程的標識
有效端口:0~65535,其中0~1024系統使用或保留端口
常見端口:Web服務:80、 Tomcat:8080、 mySQL:3306
4、 網絡模型兩種:
1. OSI OpenSystem Interconnection 開放系統互聯參考模型
2. TCP/IP參考模型
3、 常見協議:UDP、TCP
a. UDP特點:面向無連接
將數據及源和目的封裝成數據包中,不需要建立連接
每個數據報的大小在限制在64k內
因無連接,是不可靠協議
不需要建立連接,速度快
b. TCP特點:面向諒解可靠的,建立連接傳輸大量數據
建立連接,形成傳輸數據的通道。
在連接中進行大數據量傳輸
通過三次握手完成連接,是可靠協議
必須建立連接,效率會稍低
5、 InetAddress:表示互聯網協議的IP地址
//演示獲取IP實例
public class IPDemo {
public static void main(String[] args) throws IOException {
//獲取本機地址
InetAddress ip=InetAddress.getLocalHost();
//打印地址
System.out.println(ip);//ThinkPad/169.254.124.183
//獲取地址
System.out.println("address:"+ip.getHostAddress());//address:169.254.124.183
//獲取主機名
System.out.println("name:"+ip.getHostName());//name:ThinkPad
//獲取任意一臺主機地址
InetAddress ia=InetAddress.getByName("169.254.124.183");
System.out.println("ia:"+ia.getHostAddress());//ia:169.254.124.183
System.out.println("ia:"+ia.getHostName());//ia:ThinkPad
}
}
6、 Socket:網絡編程指的就是Socket編程Socket就是爲網絡服務提供的一種機制。
通信的兩端都有Socket。
網絡通信其實就是Socket間的通信。
數據在兩個Socket間通過IO傳輸。
7、 UDP傳輸
DatagramSocket與DatagramPacket
建立發送端,接收端。
建立數據包。
調用Socket的發送接收方法。
關閉Socket。
發送端與接收端是兩個獨立的運行程序。
a. 在發送端,要在數據包對象中明確目的地IP及端口。
DatagramSocket ds = new DatagramSocket();
byte[] by = “hello,udp”.getBytes();
DatagramPacket dp = new DatagramPacket(by,0,by.length,
InetAddress.getByName(“127.0.0.1”),10000);
ds.send(dp);
ds.close();
演示實例:
public class UDPDemo {
public static void main(String[] args) throws IOException {
// 創建udp服務,通過DatagramSocket()對象。
DatagramSocket ds = new DatagramSocket();
// 確定數據,並封裝成數據包。
byte[] buf = "udp ge men lai le !".getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("127.0.0.1"), 10000);
// 通過socket服務,將已有的數據包發送出去,通過send方法。
ds.send(dp);
// 關閉資源
ds.close();
}
}
b. 在接收端,要指定監聽的端口。DatagramSocket ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.close();
演示實例:
public class UDPServerDemo {
public static void main(String[] args) throws IOException {
// 創建udp Socket,建立連接
DatagramSocket ds = new DatagramSocket(10000);
// 定義數據包,用於存儲數據
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 通過服務的receive方法將接收到的數據存入到數據包中
ds.receive(dp);
// 通過數據包的方法獲取其中的數據
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println(ip + "::" + data + "::" + port);
//關閉資源
ds.close();
}
}
8、 TCP傳輸:Socket和ServerSocket
建立客戶端和服務器端
建立連接後,通過Socket中的IO流進行數據的傳輸
關閉socket
同樣,客戶端與服務器端是兩個獨立的應用程序。
客戶端基本思路:
a. 客戶端需要明確服務器的ip地址以及端口,這樣纔可以去試着建立連接,如果連接失敗,會出現異常。
b. 連接成功,說明客戶端與服務端建立了通道,那麼通過IO流就可以進行數據的傳輸,而Socket對象已經提供了輸入流和輸出流對象,通過getInputStream(),getOutputStream()獲取即可。
c. 與服務端通訊結束後,關閉Socket。
通過Socket建立對象並指定要連接的服務端主機以及端口。
Socket s = new Socket(“192.168.1.1”,9999);
OutputStream out = s.getOutputStream();
out.write(“hello”.getBytes());
s.close();
客戶端演示:
public class ClientDemo {
public static void main(String[] args) throws IOException, IOException {
//創建客戶端的Socket服務,指定目的的主機和端口
Socket s=new Socket("127.0.0.1",100001);
//爲了發送數據,應該獲取socket流中的輸出流
OutputStream out =s.getOutputStream();
out.write("TCP哥們來了".getBytes());
//關閉資源
s.close();
}
}
服務端基本思路:a. 服務端需要明確它要處理的數據是從哪個端口進入的。
b. 當有客戶端訪問時,要明確是哪個客戶端,可通過accept()獲取已連接的客戶端對象,並通過該對象與客戶端通過IO流進行數據傳輸。
c. 當該客戶端訪問結束,關閉該客戶端。
建立服務端需要監聽一個端口
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();
服務端演示:
Tcp傳輸最容易出現的問題:
客戶端連接上服務端,兩端都在等待,沒有任何數據傳輸。
通過例程分析:
因爲read方法或者readLine方法是阻塞式。
解決辦法:
自定義結束標記
使用shutdownInput,shutdownOutput方法。
9、常見的客戶端和服務端
客戶端:瀏覽器、QQ ...
服務端:Tomcat ...
http 超文本傳輸協議
10、URL對象,把地址封裝成對象,便於對地址操作
urlConnection 安卓開發方面用的比較多
public class URLDemo {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL(
"http://127.0.0.1:8080/myweb/demo.html?name=li&age=23");
System.out.println(url.getProtocol());// http
System.out.println(url.getHost());// 127.0.0.1
System.out.println(url.getPort());// 8080
System.out.println(url.getPath());// /myweb/demo.html
System.out.println(url.getFile());// /myweb/demo.html?name=li&age=23
System.out.println(url.getQuery());// name=li&age=23
URLConnection conn=url.openConnection();
System.out.println(conn);//sun.net.www.protocol.http.HttpURLConnection:http://127.0.0.1:8080/myweb/demo.html?name=li&age=23
InputStream in=conn.getInputStream();
byte[]buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
}
}
11、 http://192.168.1.254:8080/myweb/demo.htmlwww.baidu.com想要將主機名翻譯成ip地址,需要域名解析。DNS
域名解析服務器:裏面記錄的是主機名與ip地址的映射關係。
http://127.0.0.1:8080
http://localhost:8080
其實127和localhost的映射關係就在本機上。
C:\Windows\System32\drivers\etc\host
12、CS client server
特點:
1. 客戶端和服務端都需要開發
2. 後期維護較爲麻煩
3. 將服務端的部分運算轉到了客戶端。
13、BS Browser Server
特點:
1. 程序員只需要編寫服務端
2. 對客戶端的維護很容易。客戶端什麼都不需要裝,只需要有瀏覽器即可。
3.所有的運算都在服務端,壓力較大。
詳細請查看:www.itheima.com