- 網絡編程與網頁編程的區別:
- 網絡編程關注的是我們的底層數據傳輸。
- 網頁編程關注的是與客戶的交互。
- jsp,servelt,html
- 不是一個概念。
- 什麼是計算機網絡:
- 把分佈在不同地理區域的計算機與專門的外部設備用通信線路互連成一個規模大、功能強的網絡系統,從而使衆多的計算機可以方便地互相傳遞信息,共享硬件、軟件、數據信息等資源。
- 將不同區域的計算機連接到一起
- 局域網,城域網,互聯網
- 計算機網絡的主要功能
- 資源共享
- 信息傳輸與集中處理
- 均衡負荷與分佈處理
- 綜合信息服務 (www/綜合業務數字網絡 ISDN)
- 地址:
- IP地址:確定網絡上的一個絕對的地址。
- 相當於房子地址。
- 端口號:
- 區分計算機上的軟件。
- 相當於我們生活中的很多房門。2個字節:0~65535 共65536個。
- 在同一個協議下端口號不能重複,反之可以。比如TCP/UDP
- 建議1024以下的不要使用,是給主流軟件預留。80->http 21->ftp
- 資源定位:
- URL統一資源定位
- URI 統一資源
- 數據傳輸:
- 協議
- TCP 電話,三次握手,面向連接,安全可靠。效率相對低下。
- UDP短信,非面向連接,效率高。
- 傳輸:
- 先封裝
- 後拆封
- 協議
- 什麼是網絡通信協議
- 計算機網絡中實現通信必須有一些約定即通信協議,對速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等制定標準。
- 網絡通信接口
- 爲了使兩個結點之間能進行對話,必須在它們之間建立通信工具(即接口),使彼此之間 能進行信息交換。接口包括兩部分:
- 硬件裝置: 實現結點之間的信息傳送
- 軟件裝置: 規定雙方進行通信的約定協議
- 爲了使兩個結點之間能進行對話,必須在它們之間建立通信工具(即接口),使彼此之間 能進行信息交換。接口包括兩部分:
- 爲什麼要分層
- 由於結點之間聯繫很複雜,在制定協議時,把複雜成份分解成 一些簡單的成份,再將它們復合起來。最常用的複合方式是層次方式,即同層間可以通信、上一層可以調用下一層,而與再下一層不發生關係。
- 通信協議的分層規定
- 把用戶應用程序作爲最高層,把物理通信線路作爲最低層,將其間的協議處理分爲若干層,規定每層處理的任務,也規定每層的接口標準。
- 七層協議
- 物理層(Physical Layer)
- 數據鏈路層(Data Link Layer)
- 網絡層(Network Layer)網絡層協議的代表包括:IP、IPX、RIP、OSPF等
- 傳輸層(Transport Layer)傳輸層協議的代表包括:TCP、UDP、SPX等。
- 會話層(Session Layer)NetBIOS、ZIP(AppleTalk區域信息協議)等。
- 表示層(Presentation Layer) ASCII、ASN.1、JPEG、MPEG等。
- 應用層(Application Layer) Telnet、FTP、HTTP、SNMP等。
- IP (Internet Protocol)協議是網際層的主要協議,支持網間互連的數據報通信。它提供主要功能有:
- 無連接數據報傳送
- 數據報路由選擇和差錯控制
- TCP協議是一個面向連接的、可靠的協議
- TCP(transmission control protocol)
- 是一種面向連接(連接導向)的、可靠的、基於字節流的運輸層通信協議。
- 是專門設計用於在不可靠的因特網上提供可靠的、端到端的字節流通信的協議。它是一種面向連接的協議。TCP連接是字節流而非報文流。
- 特點:
- 面向連接
- 點到點的通信
- 高可靠性
- TCP三次握手
- UDP協議是一個不可靠的、無連接協議
- UDP(user datagram protocol )
- 一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
- UDP嚮應用程序提供了一種發送封裝的原始IP數據報的方法、並且發送時無需建立連接。是一種不可靠的連接
- 特點:
- 非面向連接
- 傳輸不可靠
- 數據可能丟失
- 類似於:發短信
- 數據的底層傳輸:
- 數據傳輸的底層還是流(IO)
- 兩個Java應用程序可通過一個雙向的網絡通信連接實現數據交換,這個雙向鏈路的一端稱爲一個Socket。
- Socket通常用來實現client-server連接。
- java.net包中定義的兩個類Socket和ServerSocket,分別用來實現雙向連接的client和server端
- 建立連接時所需的尋址信息爲遠程計算機的IP地址和端口號(Port number)
- 兩個字節
- 65536(TCP) 65536 (UDP)
- Socket通信模型
- ServerSocket
- 此類實現服務器套接字。
- 服務器套接字等待請求通過網絡傳入。
- 它基於該請求執行某些操作,然後可能向請求者返回結果。
- Socket
- 此類實現客戶端套接字(也可以就叫“套接字”)。
- 套接字是兩臺機器間通信的端點。
- 服務器&客戶端代碼演示:
- 服務器端:
-
public class ServerDemo { public static void main(String[] args) { try { //創建服務器對象,指定端口 ServerSocket server = new ServerSocket(8888); System.out.println("等待遊覽器連接"); Socket socket = server.accept();//偵聽並接受到此套接字的連接。 System.out.println("連接成功"); BufferedReader br = new BufferedReader(new InputStreamReader( socket.getInputStream(), "gb2312")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), "gb2312")); for (int i = 0; i < 8; i++) { System.out.println(br.readLine()); } bw.write("<html>Just do IT</html>"); bw.flush(); socket.close(); server.close(); } catch (Exception e) { e.printStackTrace(); } } }
-
-
客戶端
-
public class ClientDemo { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); System.out.println("連接成功"); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")); for (int i = 0; i < 8; i++) { // System.out.println("客戶數據第"+i+"行"); bw.write("客戶數據第" + i + "行"); bw.newLine(); } bw.flush(); System.out.println(br.readLine()); bw.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
-
- 服務器端:
- InetAddress
- 此類表示互聯網協議 (IP) 地址。
- 常用方法:
- getHostAddress()
- 返回 IP 地址字符串(以文本表現形式)。
- getHostName()
- 獲取此 IP 地址的主機名。
- getByName(String host)
- 在給定主機名的情況下確定主機的 IP 地址。
- getHostAddress()
-
代碼示例:
-
public class InetAddressDemo { public static void main(String[] args) throws UnknownHostException { InetAddress addr = InetAddress.getLocalHost(); System.out.println(addr.getHostAddress()); // 返回:192.168.136.1 System.out.println(addr.getHostName()); // 輸出計算機名: // 根據域名得到InetAddress對象 addr = InetAddress.getByName("www.qq.com"); System.out.println(addr.getHostAddress());// 輸出Ip System.out.println(addr.getHostName());// 輸出域名:www.baidu.com // 根據IP得到InetAddress對象 addr = InetAddress.getByName("115.239.211.112"); System.out.println(addr.getHostAddress());// 返回的是IP地址 System.out.println(addr.getHostName());//如果dns沒有解析,返回依然是IP地址 } }
-
- URL
- URL 代表一個統一資源定位符,它是指向互聯網“資源”的指針。
- 資源可以是簡單的文件或目錄,也可以是對更爲複雜的對象的引用,例如對數據庫或搜索引擎的查詢。
- 代碼示例:
-
public class UrlDemo { public static void main(String[] args) throws MalformedURLException { //絕對路徑構建 URL url = new URL("http://www.baidu.com:80/index.htm?uname=company#aa"); System.out.println("協議:"+url.getProtocol()); System.out.println("主機名:"+url.getHost()); System.out.println("端口:"+url.getPort()); System.out.println("資源:"+url.getFile()); System.out.println("錨點:"+url.getRef()); // 參數 存在錨點,返回null,如果沒有錨點返回正確。 System.out.println("參數"+url.getQuery()); url = new URL(url, "/b.txt");//相對路徑 System.out.println(url); System.out.println(url.getPath()); } }
-
- 代碼示例:
- Socket編程通常會和多線程進行配合使用,使用GUI顯示