第十四章:Java_网络编程
網絡編程概述:
Java是 Internet 上的語言,它從語言級上提供了對網絡應用程序的支持,程序員能夠很容易開發常見的網絡應用程序。
Java提供的網絡類庫,可以實現無痛的網絡連接,聯網的底層細節被隱藏在 Java 的本機安裝系統里,由 JVM 進行控制。并且 Java 實現了一個跨平臺的網絡庫,程序員面對的是一個統一的網絡編程環境。
1.要想實現網絡傳輸,需要考慮的問題有哪些?
1.1 如何才能準確的定位網絡上的一臺主機?
1.2 如何才能進行可靠的、高效的數據傳輸?
2.Java如何實現的網絡通信
2.1使用IP地址—定位一臺主機 使用端口號—定位一個應用 ===>InetAddress類
①如何創建一個InetAddress的對象?getByName(“”); 比如:InetAddress inet = InetAddress.getByName(“192.168.10.165”);
②如何獲取本機的一個InetAddress的對象?getLocalHost()
③域名:getHostName() ip:getHostAddress()2.2對應有協議
通訊要素1:IP 和 端口號
IP 地址:InetAddress
唯一的標識 Internet 上的計算機
本地回環地址(hostAddress):127.0.0.1 主機名(hostName):localhost
不易記憶
端口號標識正在計算機上運行的進程(程序)
不同的進程有不同的端口號
被規定為一個 16 位的整數 0~65535。其中,0~1023被預先定義的服務通信占用(如MySql占用端口3306,http占用端口80等)。除非我們需要訪問這些特定服務,否則,就應該使用 1024~65535 這些端口中的某一個進行通信,以免發生端口沖突。
端口號與IP地址的組合得出一個網絡套接字。
通訊要素2:網絡通信協議
網絡通信協議
計算機網絡中實現通信必須有一些約定,即通信協議,對速率、傳輸代碼、代碼結構、傳輸控制步驟、出錯控制等制定標準。
通信協議分層的思想
由于結點之間聯系很復雜,在制定協議時,把復雜成份分解成一些簡單的成份,再將它們復合起來。最常用的復合方式是層次方式,即同層間可以通信、上一層可以調用下一層,而與再下一層不發生關系。各層互不影響,利于系統的開發和擴展。
TCP/IP協議簇
- 傳輸層協議中有兩個非常重要的協議:
傳輸控制協議TCP(Transmission Control Protocol)
用戶數據報協議UDP(User Datagram Protocol)。 - TCP/IP 以其兩個主要協議:傳輸控制協議(TCP)和網絡互聯協議(IP)而得名,實際上是一組協議,包括多個具有不同功能且互為關聯的協議。
- IP(Internet Protocol)協議是網絡層的主要協議,支持網間互連的數據通信。
- TCP/IP協議模型從更實用的角度出發,形成了高效的四層體系結構,即物理鏈路層、IP層、傳輸層和應用層。
TCP和UDP
- TCP協議:
使用TCP協議前,須先建立TCP連接,形成傳輸數據通道
傳輸前,采用“三次握手”方式,是可靠的
TCP協議進行通信的兩個應用進程:客戶端、服務端
在連接中可進行大數據量的傳輸
傳輸完畢,需釋放已建立的連接,效率低 - UDP協議:
將數據、源、目的封裝成數據包,不需要建立連接
每個數據報的大小限制在64K內
因無需連接,故是不可靠的
發送數據結束時無需釋放資源,速度快
TCP的編程: Socket ServerSocket
例子:
1.客戶端發送內容給服務端,服務端將內容打印到控制臺上。
2.客戶端發送內容給服務端,服務端給予反饋。
//TCP編程例二:客戶端給服務端發送信息,服務端將信息打印到控制臺上,同時發送“已收到信息”給客戶端 public class TestTCP2 {//客戶端@Testpublic void client(){Socket socket = null;OutputStream os = null;InputStream is = null;try {socket = new Socket(InetAddress.getByName("127.0.0.1"),8989);os = socket.getOutputStream();os.write("我是客戶端".getBytes());//shutdownOutput():執行此方法,顯式的告訴服務端發送完畢!socket.shutdownOutput();is = socket.getInputStream();byte[] b = new byte[20];int len;while((len = is.read(b)) != -1){String str = new String(b,0,len);System.out.print(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(is != null){try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(os != null){try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//服務端@Testpublic void server(){ServerSocket ss = null;Socket s = null;InputStream is = null;OutputStream os = null;try {ss = new ServerSocket(8989);s = ss.accept();is = s.getInputStream();byte[] b = new byte[20];int len;while((len = is.read(b)) != -1){String str = new String(b,0,len);System.out.print(str);}os = s.getOutputStream();os.write("我已收到你的情意".getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(os != null){try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(is != null){try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(s != null){try {s.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(ss != null){try {ss.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }3.從客戶端發送文件給服務端,服務端保存到本地。并返回“發送成功”給客戶端。并關閉相應的連接。
//TCP編程例三:從客戶端發送文件給服務端,服務端保存到本地。并返回“發送成功”給客戶端。并關閉相應的連接。 //如下的程序,處理異常時,要使用try-catch-finally!!本例僅為了書寫方便~ public class TestTCP3 {@Testpublic void client()throws Exception{//1.創建Socket的對象Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9898);//2.從本地獲取一個文件發送給服務端OutputStream os = socket.getOutputStream();FileInputStream fis = new FileInputStream(new File("1.jpg"));byte[] b = new byte[1024];int len;while((len = fis.read(b)) != -1){os.write(b,0,len);}socket.shutdownOutput();//3.接收來自于服務端的信息InputStream is = socket.getInputStream();byte[] b1 = new byte[1024];int len1;while((len1 = is.read(b1)) != -1){String str = new String(b1,0,len1);System.out.print(str);}//4.關閉相應的流和Socket對象is.close();os.close();fis.close();socket.close();}@Testpublic void server() throws Exception{//1.創建一個ServerSocket的對象ServerSocket ss = new ServerSocket(9898);//2.調用其accept()方法,返回一個Socket的對象Socket s = ss.accept();//3.將從客戶端發送來的信息保存到本地InputStream is = s.getInputStream();FileOutputStream fos = new FileOutputStream(new File("3.jpg"));byte[] b = new byte[1024];int len;while((len = is.read(b)) != -1){fos.write(b, 0, len);}System.out.println("收到來自于" + s.getInetAddress().getHostAddress() + "的文件");//4.發送"接收成功"的信息反饋給客戶端OutputStream os = s.getOutputStream();os.write("你發送的圖片我已接收成功!".getBytes());//5.關閉相應的流和Socket及ServerSocket的對象os.close();fos.close();is.close();s.close();ss.close();} }UDP的編程: DatagramSocket DatagramPacket
//UDP編程的實現 public class TestUDP {// 發送端@Testpublic void send() {DatagramSocket ds = null;try {ds = new DatagramSocket();byte[] b = "你好,我是要發送的數據".getBytes();//創建一個數據報:每一個數據報不能大于64k,都記錄著數據信息,發送端的IP、端口號,以及要發送到//的接收端的IP、端口號。DatagramPacket pack = new DatagramPacket(b, 0, b.length,InetAddress.getByName("127.0.0.1"), 9090);ds.send(pack);}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(ds != null){ds.close();}}}// 接收端@Testpublic void rceive() {DatagramSocket ds = null;try {ds = new DatagramSocket(9090);byte[] b = new byte[1024];DatagramPacket pack = new DatagramPacket(b, 0, b.length);ds.receive(pack);String str = new String(pack.getData(), 0, pack.getLength());System.out.println(str);}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(ds != null){ds.close();}}} }URL的編程:統一資源定位符一個URL的對象,對應著互聯網上一個資源。
我們可以通過URL的對象調用其相應的方法,將此資源讀取(“下載”)
//URL:統一資源定位符,一個URL的對象,對應著互聯網上一個資源。 //我們可以通過URL的對象調用其相應的方法,將此資源讀取(“下載”) public class TestURL {public static void main(String[] args) throws Exception {//1.創建一個URL的對象URL url = new URL("http://127.0.0.1:8080/examples/HelloWorld.txt?a=b");//File file = new File("文件的路徑");/** public String getProtocol( ) 獲取該URL的協議名public String getHost( ) 獲取該URL的主機名public String getPort( ) 獲取該URL的端口號public String getPath( ) 獲取該URL的文件路徑public String getFile( ) 獲取該URL的文件名public String getRef( ) 獲取該URL在文件中的相對位置public String getQuery( ) 獲取該URL的查詢名*/ // 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()); // System.out.println(url.getQuery());//如何將服務端的資源讀取進來:openStream()InputStream is = url.openStream();byte[] b = new byte[20];int len;while((len = is.read(b)) != -1){String str = new String(b,0,len);System.out.print(str);}is.close();//如果既有數據的輸入,又有數據的輸出,則考慮使用URLConnectionURLConnection urlConn = url.openConnection();InputStream is1 = urlConn.getInputStream();FileOutputStream fos = new FileOutputStream(new File("abc.txt"));byte[] b1 = new byte[20];int len1;while((len1 = is1.read(b1)) != -1){fos.write(b1, 0, len1);}fos.close();is1.close();} }小結
位于網絡中的計算機具有唯一的IP地址,這樣不同的主機可以互相區分。
客戶端-服務器是一種最常見的網絡應用程序模型。服務器是一個為其客戶端提供某種特定服務的硬件或軟件。客戶機是一個用戶應用程序,用于訪問某臺服務器提供的服務。端口號是對一個服務的訪問場所,它用于區分同一物理計算機上的多個服務。套接字用于連接客戶端和服務器,客戶端和服務器之間的每個通信會話使用一個不同的套接字。TCP協議用于實現面向連接的會話。
Java 中有關網絡方面的功能都定義在 java.net 程序包中。Java 用 InetAddress 對象表示 IP 地址,該對象里有兩個字段:主機名(String) 和 IP 地址(int)。
Java 中有關網絡方面的功能都定義在 java.net 程序包中。Java 用 InetAddress 對象表示 IP 地址,該對象里有兩個字段:主機名(String) 和 IP 地址(int)。
類 URL 和 URLConnection 提供了最高級網絡應用。URL 的網絡資源的位置來同一表示 Internet 上各種網絡資源。通過URL對象可以創建當前應用程序和 URL 表示的網絡資源之間的連接,這樣當前程序就可以讀取網絡資源數據,或者把自己的數據傳送到網絡上去。
總結
以上是生活随笔為你收集整理的第十四章:Java_网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方立勋_30天掌握JavaWeb_XML
- 下一篇: 第一章:Java语言概述