Java网络编程从0——》入门
目錄:
1.軟件結構
2. 網絡編程三要素
3. TCP通信程序(Socket和ServerSocket)
1.軟件結構
1.C/S結構:全稱是Client/Server結構,是指客戶端和服務器結構如QQ微信等
2.B/S全稱Browser/Server,是指瀏覽器和服務器結構,常見谷歌火狐等
網絡編程,就是在一定的協議下,實現兩臺計算機 的通信的程序。
2.網絡編程三要素
1.網絡通信協議
2.IP地址
3.端口號
2.1.協議
1.網絡通信協議:通信協議是對計算機必須遵守的規則,只有遵守這些規則,計算機之間才能進行通信。這就 好比在道路中行駛的汽車一定要遵守交通規則一樣,協議中對數據的傳輸格式、傳輸速率、傳輸步驟等做了 統一規定,通信雙方必須同時遵守,最終完成數據交換。這里協議也分為兩種:
2.TCP/IP協議:傳輸控制協議/因特網互聯協議( Transmission Control Protocol/Internet Protocol),是 Internet最基本、最廣泛的協議。它定義了計算機如何連入因特網,以及數據如何在它們之間傳輸的標準。它 的內部包含一系列的用于處理數據通信的協議,并采用了4層的分層模型,每一層都呼叫它的下一層所提供的 協議來完成自己的需求。如下圖:
3.網絡通信協議的分類
1.TCP協議
傳輸控制協議 (Transmission Control Protocol)。TCP協議是面向連接的通信協議,即傳輸數據之前, 在發送端和接收端建立邏輯連接,然后再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。 三次握手:TCP協議中,在發送數據的準備階段,客戶端與服務器之間的三次交互,以保證連接的可 靠。 第一次握手,客戶端向服務器端發出連接請求,等待服務器確認。 第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求。 第三次握手,客戶端再次向服務器端發送確認信息,確認連接。整個交互過程如下圖所示。
完成三次握手,連接建立后,客戶端和服務器就可以開始進行數據傳輸了。由于這種面向連接的
- 第一次握手,客戶端向服務器端發出連接請求,等待服務器確認。
- 第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求。
- 第三次握手,客戶端再次向服務器端發送確認信息,確認連接。
三次握手如圖:
完成三次握手,連接建立后,客戶端和服務器就可以開始進行數據傳輸了。由于這種面向連接的特性,TCP協議可 以保證傳輸數據的安全,所以應用十分廣泛,例如下載文件、瀏覽網頁等
2.UDP協議
用戶數據報協議(User Datagram Protocol)。UDP協議是一個面向無連接的協議。傳輸數據時,不需 要建立連接,不管對方端服務是否啟動,直接將數據、數據源和目的地都封裝在數據包中,直接發送。每個 數據包的大小限制在64k以內。它是不可靠協議,因為無連接,所以傳輸速度快,但是容易丟失數據。日常應 用中,例如視頻會議、QQ聊天等。
2.2.IP地址
1.IP地址:指互聯網協議地址(Internet Protocol Address),俗稱IP。IP地址用來給一個網絡中的計算機設 備做唯一的編號。我們的計算機想要連接到互聯網上的計算機就要通過IP地址(就像你想打電話給你媽,你自身相當于一臺計算機,電話號碼相當于IP地址,你媽相當于互聯網上的計算機)
2.IP地址的分類:
1.IPv4:是一個32位的二進制數,通常被分為4個字節,表示成 a.b.c.d 的形式,例如 192.168.65.100 。其 中a、b、c、d都是0~255之間的十進制整數,那么最多可以表示42億個。
2.IPv6:由于互聯網的蓬勃發展,IP地址的需求量愈來愈大,但是網絡地址資源有限,使得IP的分配越發緊張。 有資料顯示,全球IPv4地址在2011年2月分配完畢。 為了擴大地址空間,擬通過IPv6重新定義地址空間,采用128位地址長度,每16個字節一組,分成8組十六進 制數,表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,號稱可以為全世界的每一粒沙子編上一個網 址,這樣就解決了網絡地址資源數量不夠的問題。
那么我們在我們windows操作系統上可以查看我們的端口號:
指令:
ipconfig
查看本臺計算機和指定IP地址的計算機之間是否可以正常地通信
ping 空格 IP地址
有兩個特殊的IP地址:
(1)127.0.0.1:代表自己電腦的IP地址
(2)localhost:也代表本地的IP地址
2.3.端口號
1.端口號是干嘛的?
我們知道我們通過IP地址可以建立兩臺計算機之間的連接,但是比如我們在使用QQ的時候我們給朋友發送一條信息,那么計算機怎么知道我這條信息是要發送到朋友的QQ上而不是朋友的微信上,這時候就需要我們的端口號了
2.端口號是啥?
端口號是一個邏輯端口,我們無法看到或者直接使用,我們的一些網絡軟件(QQ微信等等)一打開系統就會為網絡分配一個隨機的端口號或者在軟件打開的時候向系統要指定的端口號
3.來個端口號高大上的定義:
端口號是可以唯一標識設備中的進程(應用程序)
4.端口號的表示:
端口號:用兩個字節表示的整數,它的取值范圍是0~ 65535。其中,0~1023之間的端口號用于一些知名的網 絡服務和應用,普通的應用程序需要使用1024以上的端口號。如果端口號被另外一個服務或應用所占用,會 導致當前程序啟動失敗。
5.端口號的注意點:
- 1.端口號為1024前的我們不能是使用,系統已經分配給已知的網絡軟件
- 2.網絡的端口號不能重復
- 3.我們一些軟件的指定端口號如:mysql為3306,oracle1521等等
利用 協議 + IP地址 + 端口號 三元組合,就可以標識網絡中的進程了,那么進程間的通信就可以利用這個標識與其 它進程進行交互。
3. TCP通信程序
3.1通信程序的概述
1.TCP通信能實現兩臺計算機之間的數據交互,通信的兩端,要嚴格區分為客戶端與服務端
2.兩端通信時步驟:
客戶端和服務器端建立邏輯連接后這個連接中包含一個對象,就是一個I/O流對象,客戶端和服務器端可以使用I/O對象進行數據在兩者之間的傳輸,由于數據不僅僅是字符,所以I/O對象是字節流
這里有兩個注意點
1.多個客戶端同時和服務器進行交互,服務器必須明確和哪一個客戶端進行交互在服務器端有一個方法叫accept客戶端獲取到請求的客戶端對象
2.多個客戶端同時和服務器進行交互,就需要使用多個I/O流對象
3.服務器是沒有I/O流對象的,服務器可以獲取到請求的客戶端對象Socket(下面會講)使用每個客戶端Socket中提供的I/O流對象和客戶端進行交互
3.在Java中,提供了兩個類用于實現TCP通信程序:
3.2 Socket類
1.socket類作用:
Socket 類:該類實現客戶端套接字,套接字指的是兩臺設備之間通訊的端點
套接字:包含了IP地址和端口號的網絡單位
2.構造方法:
public Socket(String host, int port):創建套接字對象并將其連接到指定主機上的指定端口號。如果指 定的host是null ,則相當于指定地址為回送地址。
String host:服務器主機的名字/服務器的IP地址
int port:服務器的端口號
3.成員方法:
| public InputStream getInputStream() | 返回此套接字的輸入流。 如果此Scoket具有相關聯的通道,則生成的InputStream 的所有操作也關聯該通道。 關閉生成的InputStream也將關閉相關的Socket。 |
| public OutputStream getOutputStream() | 返回此套接字的輸出流。 如果此Scoket具有相關聯的通道,則生成的OutputStream 的所有操作也關聯該通道。 關閉生成的OutputStream也將關閉相關的Socket。 |
| public void close() | 關閉此套接字。 一旦一個socket被關閉,它不可再使用。 關閉此socket也將關閉相關的InputStream和OutputStream 。 |
| public void shutdownOutput() | 禁用此套接字的輸出流。任何先前寫出的數據將被發送,隨后終止輸出流 |
4.實現步驟:
- 1.創建一個客戶端對象Socket,構造方法綁定服務器的IP地址和端口號
- 2.使用Socket對象中的方法getOutputStream()獲取網絡字節輸出流OutputStream
- 3.使用網絡字節輸出流OutputStream對象中的方法write給服務器發送數據
- 4.使用Socket對象中的方法getInputStream() 獲取網絡字節輸入流InputStream對象
- 5.使用網絡字節輸入流InputStram對象中的方法read讀取服務器回寫的數據
- 6.釋放資源
3.3 ServerSocket類
1.ServerSocket 類作用: >ServerSocket 類:這個類實現了服務器套接字,該對象等待通過網絡的請求。2.構造方法:
public ServerSocket(int port) :使用該構造方法在創建ServerSocket對象時,就可以將其綁定到一個指 定的端口號上,參數port就是端口號
3.成員方法:
public Socket accept() :偵聽并接受連接,返回一個新的Socket對象,用于和客戶端實現通信。該方法 會一直阻塞直到建立連接
4.實現步驟:
- 1.創建服務器ServerSocket對象和系統指定的端口號
- 2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端對象Socket
- 3.使用Socket對象中的方法getInputStream()獲取網絡字節輸出流 InputStream對象
- 4.使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端發送的數據
- 5.使用Socket對象中的方法getOutStream()獲取網絡字節輸出流OutputStram對象
- 6.使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫數據
- 7.釋放資源
本例子和上邊例子連在一起就組成了一個完整的客戶端和服務器,注意這里服務器要先運行,這樣客戶端才能和服務器進行連接,然后相互交換數據
運行結果:
本例子輸出:
你為啥這么帥
上一個例子輸出:
帥到無能為力,帥到感動自己
3.4 TCP通信分析圖解
1 .【服務端】啟動,創建ServerSocket對象,等待連接。 Socket client = new Socket(“127.0.0.1”, 6666); ServerSocket server = new ServerSocket(6666);
2. 【客戶端】啟動,創建Socket對象,請求連接。
3. 【服務端】接收連接,調用accept方法,并返回一個Socket對象。
4. 【客戶端】Socket對象,獲取OutputStream,向服務端寫出數據。
5. 【服務端】Scoket對象,獲取InputStream,讀取客戶端發送的數據。
6. 【服務端】Socket對象,獲取OutputStream,向客戶端回寫數據。
7. 【客戶端】Scoket對象,獲取InputStream,解析回寫數據。 ]
8. 【客戶端】釋放資源,斷開連接。
總結
以上是生活随笔為你收集整理的Java网络编程从0——》入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三万字的java I/O流基础总结看完
- 下一篇: 给我十分钟带你过完java多线程所有基础