第13篇-JAVA 網絡編程
每篇一句 比我強大的人都在努力我還有什麼理由不拼命
初學心得 不去追逐你所渴求你將永遠不會擁有
(筆者JEEP/711)[JAVA筆記 | 時間:2017-04-22| JAVA 網絡編程 ]
1.網絡編程基本概念
1.什麼是計算機網絡
計算機網絡是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備通過通信線路連接起來在網絡操作系統網絡管理軟件及網絡通訊協議的管理和協調下實現資源共享和信息傳遞的計算機系統
把分佈在不同地理區域的計算機與專門的外部設備用通訊線路互連成一個規模大
功能強的網絡系統從而使衆多的計算機可以方便地相互傳遞信息共享硬件軟件、數據信息等資源
2.計算機網絡的主要功能
資源共享信息傳輸與集中處理均衡負荷與分佈處理綜合信息服務(www/綜合業務數字網絡ISDN)等
3.網絡通訊協議
要使計算機連成網絡能夠互相通信需要對數據傳輸速率傳輸代碼代碼結構傳輸控制步驟出錯
控制等制定一組標準這一組共同遵守的通訊標準就是網絡通訊協議
4.網絡通訊接口
爲了是這兩個結點之間進行對話必須在它們之間建立通訊工具(既接口)
使彼此之間能進行信息交換接口包括兩部分
1.硬件裝置實現結點之間的信息傳遞
2.軟件裝置規定雙方進行通訊的約定協議
4.TCP/IP
5.程序開發結構5.IP協議
IP協議是Internet上使用的一個關鍵協議它的全稱是Internet Protocol即Internet協議通常簡稱IP協議
通過使用IP協議從而使Internet成爲一個允許連接不同類型的計算機和不同操作系統的網絡。
IP協議只保證計算機能發送和接收分組數據。IP協議負責將消息從一個主機傳送到另一個主機消息在傳送的過程中被分割成一個個的小包6.Java對TCP/IP協議的支持
TCP/IP通信協議是一種可靠的網絡協議它在通信的兩端各建立一個Socket從而在通信的兩端之間形成網絡虛擬鏈路
一旦建立了虛擬的網絡鏈路兩端的程序就可以通過虛擬鏈路進行通信
Java對基於TCP協議的網絡通信提供了良好的封裝Java使用Socket對象來代表兩端的通信接口並通過Socket產生IO流來進行網絡通信
2.網絡通訊協議TCP/IP UDP
IP的概念
IP是互聯網上的每一臺計算機都有得一個唯一表示自己的標記
IP地址使用4個8位的二進制數據表示,每8位之間使用圓點隔開每個8位整數可以轉換成一個0~255的十進制整數
因此一般看到的IP地址類似192.168.1.1IP地址分類
IPv432位分4段0~255之間的十進制表示
IPv6128位分8段0000~FFFF的十六進制數值冒號分割
如1080:0:0:0:8:800:200C:417AIP地址 = 網絡地址 + 主機地址
網絡號用於識別主機所在的網絡
主機號用於識別該網絡的主機
什麼是端口
如果把IP地址比作一間房子 端口就是出入這間房子的門。真正的房子只有幾個門但是一個IP地址的端口 可以有65536即2^16個之多端口是通過端口號來標記的端口號只有整數範圍是從0 到655352^16-1
同一臺機器上不能有兩個程序使用同一個端口端口的分類
公認端口0~1023他們緊密綁定一些服務
註冊端口1024~49151鬆散綁定一些服務
動態端口49152~65535動態使用的端口程序一般不會使用這些端口
TCP協議
TCP協議被稱作一種端對端協議
這是因爲它爲兩臺計算機之間的連接起了重要作用當一臺計算機需要與另一臺遠程計算機連接時TCP協議會讓它們建立一個連接用於發送和接收數據的虛擬鏈路。
TCP協議負責收集這些信息包並將其按適當的次序放好傳送在接收端收到後再將其正確地還原
TCP協議保證了數據包在傳送中準確無誤。TCP協議使用重發機制當一個通信實體發送一個消息給另一個通信實體後需要收到另一個通信實體確認信息如果沒有收到另一個通信實體的確認信息則會再次重發剛纔發送的信息
通過這種重發機制TCP協議嚮應用程序提供可靠的通信連接使它能夠自動適應網上的各種變化。即使在 Internet 暫時出現堵塞的情況下TCP也能夠保證通信的可靠
UDP協議
UDP協議是一種不可靠的網絡協議
它在通信實例的兩端各建立一個Socket但這兩個Socket之間並沒有虛擬鏈路這兩個Socket只是發送、接收數據報的對象Java提供了DatagramSocket對象作爲基於UDP協議的Socket使用DatagramPacket代表DatagramSocket發送、接收的數據報
發送端在發送端要在數據包對象中明確目的地IP及端口
1.DatagramSocket ds = new DatagramSocket(); 2.byte[] by = “hello,udp”.getBytes(); 3.DatagramPacket dp = new DatagramPacket(by,0,by.length, 4. InetAddress.getByName(“127.0.0.1”),10000); 5.ds.send(dp); 6.ds.close();接收端在接收端要指定監聽的端口
1.DatagramSocket ds = new DatagramSocket(10000); 2.byte[] by = new byte[1024]; 3.DatagramPacket dp = new DatagramPacket(by,by.length); 4.ds.receive(dp); 5.String str = new String(dp.getData() ); 6.System.out.println(str+"--"+dp.getAddress()); 7.ds.close();
3.UDP和TCP的對比
TCP協議可靠傳輸大小無限制但是需要連接建立時間差錯控制開銷大
UDP協議不可靠差錯控制開銷較小傳輸大小限制在64K以下不需要建立連接
4.QSI七層模型
物理比特流 網卡
數據鏈路數據幀 交換機
網絡IP TCP上層數據 數據包 路由器
傳輸TCP上頭上層數據 數據段 防火牆
會話
表示
應用 上層數據 48位2進制 計算機TCP/IP4 TCP/IP5 TCP/IP7
物理層 0,1 比特流
數據鏈路層
網絡層 數據包封裝結構
傳輸層
會話層建立會話關係TCP/
ARP轉爲Mark地址
ICMP傳輸用戶協議TCP需要同步才能傳輸數據安全性高/傳輸控制協議 三次握手 四次結束
HTTP傳輸協議
FTP文件傳輸協議
SMTP郵件傳輸協議
DNS將域名轉化爲地址
UDP效率更快但不安全/用戶數據協議ARP將IP解析成Mark地址的過程
arp -a 爲了防止欺騙實行綁定地址
實現字節流和字符流分別實現客戶端服務器返回
5.ServerSocket和Socket
1.ServerSocket(服務端)
ServerSocket對象用於監聽來自客戶端的Socket連接如果沒有連接它將一直處於等待狀態
ServerSocket包含一個監聽來自客戶端連接請求的方法
Socket accept()如果接收到一個客戶端Socket的連接請求該方法將返回一個與連客戶端Socket對應的Socket否則該方法將一直處於等待狀態線程也被阻塞
爲了創建ServerSocket對象ServerSocket類提供瞭如下幾個構造器
ServerSocket(int port)用指定的端口port來創建一個ServerSocket
該端口應該是有一個有效的端口整數值065535
ServerSocket(int port,int backlog)增加一個用來改變連接隊列長度的參數backlog
ServerSocket(int port,int backlog,InetAddress localAddr)在機器存在多個 IP地址的情況下允許通過localAddr這個參數來指定將ServerSocket綁定到指定的IP地址
服務端建立服務端需要監聽一個端口
1.ServerSocket ss = new ServerSocket(9999); 2.Socket s = ss.accept (); 3.InputStream in = s.getInputStream(); 4.byte[] buf = new byte[1024]; 5.int num = in.read(buf); 6.String str = new String(buf,0,num); 7.System.out.println(s.getInetAddress().toString()+”:”+str); 8.s.close(); 9.ss.close();
2.Socket(客戶端)
客戶端通常可使用Socket的構造器來連接到指定服務器Socket通常可使用如下兩個構造器
Socket(InetAddress/String remoteAddress, int port)創建連接到指定遠程主機、遠程端口的Socket該構造器沒有指定本地地址、本地端口默認使用本地主機的默認IP地址默認使用系統動態指定的IP地址
Socket(InetAddress/String remoteAddress, int port, InetAddress localAddr, int localPort)創建連接到指定遠程主機、遠程端口的Socket並指定本地IP地址和本地端口號適用於本地主機有多個IP地址的情形
客戶端通過Socket建立對象並指定要連接的服務端主機以及端口
1.Socket s = new Socket(“192.168.1.1”,9999); 2.OutputStream out = s.getOutputStream(); 3.out.write(“hello”.getBytes()); 4.s.close();
6.網絡通信
當客戶端、服務器端產生了對應的Socket之後程序無需再區分服務器、客戶端而是通過各自的Socket進行通信Socket提供如下兩個方法來獲取輸入流和輸出流
InputStream getInputStream()返回該Socket對象對應的輸入流讓程序通過該輸入流從Socket中取出數據
OutputStream getOutputStream()返回該Socket對象對應的輸出流讓程序通過該輸出流向Socket中輸出數據
7.網絡HTTP互聯實例
實例一下載網絡圖片保存到此項目目錄
1.package cn.http; 2.import java.io.File; 3.import java.io.FileOutputStream; 4.import java.io.IOException; 5.import java.io.InputStream; 6.import java.net.MalformedURLException; 7.import java.net.URL; 8.import java.net.URLConnection; 9.public class HttpPhoto { 10. @SuppressWarnings("resource") 11. public static void main(String[] args) { 12. //打開url網址 13. String url = "http://t1.27270.com/uploads/150609/7-1506091506401R.jpg"; 14. try { 15. URL uu = new URL(url);//創建URL對象 16. URLConnection uc = uu.openConnection();//返回URLConnection 17. uc.connect();//發起請求連接 18. InputStream in = uc.getInputStream();//輸入 19. byte[] bytes = new byte[1024];//字節儲存 20. int len = 0; 21. File f = new File("美女圖片.jpg");//將圖片保存跟目錄 22. FileOutputStream fos = new FileOutputStream(f);//輸出 23. //循環讀取 24. while((len = in.read(bytes))!=-1){ 25. fos.write(bytes,0,len); 26. } 27. System.out.println("圖片下載成功!"); 28. } catch (MalformedURLException e) { 29. e.printStackTrace(); 30. } catch (IOException e) { 31. e.printStackTrace(); 32. } 33. } 34.}
實例二與網絡機器人聊天功能
1.package cn.http; 2.import java.io.BufferedReader; 3.import java.io.IOException; 4.import java.io.InputStreamReader; 5.import java.net.MalformedURLException; 6.import java.net.URL; 7.import java.net.URLConnection; 8.import java.util.Scanner; 9./** 10. * 連接接口實現聊天功能 11. * JSON數據格式 12. * @author JEEP-711 13. */ 14.public class HttpCalling { 15. @SuppressWarnings({ "unused", "resource" }) 16. public static void main(String[] args) { 17. String name = "諮詢助理"; 18. Scanner sc = new Scanner(System.in);//接收進控制鍵盤輸入 19. System.out.println("Hi現在我們已經是好友啦,開始我們的聊天吧!");//提示 20. //循環輸入 21. while(true){ 22. System.out.println("請輸入...");//提示 23. String user = sc.next();//用戶輸入內容 24. //打開url接口網址 25. String url = "http://www.tuling123.com/openapi/api?key=4c767f02ca7b44378156821ab35856df&info="+user; 26. try { 27. URL uu = new URL(url);//創建URL對象 28. URLConnection uc = uu.openConnection();//返回URLConnection 29. uc.connect();//發起請求連接 30. //讀取原文件 31. BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream())); 32. StringBuffer sb = new StringBuffer(); 33. String s = ""; 34. s = br.readLine(); 35. String[] str = s.split(":");//分隔字符串 36. String[] strs = str[2].split("\""); 37. //for數組 38. for(String sr : strs){ 39. System.out.println(name +"發來消息:"+strs[1]); 40. } 41. //JSONObject jc = new JSONObject(s); 42. //System.out.println(name +"發來消息:"+br.readLine()); 43. } catch (MalformedURLException e) { 44. e.printStackTrace(); 45. } catch (IOException e) { 46. e.printStackTrace(); 47. } 48. } 49. } 50.}
實例三網絡編程傳輸文件
1.package cn.socket; 2.import java.io.DataInputStream; 3.import java.io.File; 4.import java.io.FileOutputStream; 5.import java.net.ServerSocket; 6.import java.net.Socket; 7./** 8. * 服務端 9. * @author JEEP-711 10. * 11. */ 12.public class Servers extends ServerSocket{ 13. private static final int PORT = 8000;//定義靜態整形常量端口號 14. private ServerSocket ss;//定義服務端 15. private Socket sk;//定義客戶端 16. private DataInputStream d;//定義 17. private FileOutputStream fp;//定義文件傳輸 18. //定義構造方法並拋出異常 19. public Servers()throws Exception{ 20. try { 21. try { 22. ss = new ServerSocket(PORT);//傳值-端口號 23. while(true){ 24. sk = ss.accept(); 25. d = new DataInputStream(sk.getInputStream()); 26. //文件名和長度 27. String fileName = d.readUTF(); 28. long fileLeng = d.readLong(); 29. fp =new FileOutputStream(new File("src\\" + fileName)); 30. byte[] bytes = new byte[1024];//定義爲1024個字節 31. int len = 0;//定義爲0 32. //文件傳輸提示 33. System.out.println("----正在開始接收文件<" + fileName +">,文件大小爲<" + fileLeng +">----"); 34. while(true){ 35. int read =0; 36. read = d.read(bytes); 37. if(read == -1) 38. break; 39. len += read; 40. System.out.println("接收文件進度" +100 * len/fileLeng +"%...");//文件接收提示 41. fp.write(bytes,0, read);// 42. fp.flush();//刷新 43. } 44. System.out.println("----接收文件<" + fileName +">成功-------"); 45. sk.close();//關閉流客戶端 46. } 47. }catch (Exception e) { 48. e.printStackTrace(); 49. //統一出口 50. }finally { 51. //如果傳輸不等於空 52. if(d !=null) 53. d.close();//則關閉傳輸流 54. //如果文件傳輸不等於空 55. if(fp !=null) 56. fp.close();//則關閉傳輸文件流 57. ss.close();//關閉服務器流 58. } 59. }catch (Exception e) { 60. e.printStackTrace(); 61. } 62. } 63. @SuppressWarnings("resource") 64. public static void main(String[] args) throws Exception{ 65. new Servers();//調用Servers方法 66. } 67.}
1.package cn.socket; 2.import java.io.DataOutputStream; 3.import java.io.File; 4.import java.io.FileInputStream; 5.import java.net.Socket; 6./** 7. * 客戶端 8. * @author JEEP-711 9. * 10. */ 11.public class Cilens extends Socket{ 12. private static final String server_ip = "192.168.199.109";//定義靜態字符串常量IP地址 13. private static final int duankou = 8000;//定義靜態整形常量端口號 14. private Socket s;//定義服務器 15. private FileInputStream f;//定義文件 16. private DataOutputStream d;//定義傳輸 17. //構造方法 18. public Cilens(){ 19. try { 20. try { 21. s = new Socket(server_ip,duankou);//傳參數 22. //向服務端傳送文件 23. File file =new File("src\\test.doc");//文件在src目錄下 24. f = new FileInputStream(file);//傳文件 25. d = new DataOutputStream(s.getOutputStream()); 26. //文件名和長度 27. d.writeUTF(file.getName());//文件名稱 28. d.flush();//刷新 29. d.writeLong(file.length());//文件長度 30. d.flush();//傳輸刷新 31. //傳輸文件 32. byte[] Bytes =new byte[1024];//定義byte1024的字節 33. int len = 0;//定義len爲0 34. //循環 35. while((len = f.read(Bytes,0,Bytes.length)) >0){ 36. d.write(Bytes,0, len);//字節從0到len 37. d.flush();//傳輸刷新 38. } 39. }catch (Exception e) { 40. e.printStackTrace(); 41. }finally{ 42. //如果文件不等於空 43. if(f !=null) 44. f.close();//則關閉流 45. //如果傳輸不等於空 46. if(d !=null) 47. d.close();//則關閉流 48. s.close();//關閉流 49. } 50. }catch (Exception e) { 51. e.printStackTrace(); 52. } 53. } 54. @SuppressWarnings("resource") 55. public static void main(String[] args) throws Exception { 56. new Cilens();//調用方法 57. } 58.}
初學(JAVA 網絡編程 高級階段) 難點: ★★★★★
希望每一篇文章都能夠對讀者們提供幫助與提升這乃是每一位筆者的初衷
感謝您的閱讀 歡迎您的留言與建議
FaceBookJEEP SevenEleven
Twitter@JEEP7ll
新浪官方微博: @JEEP-711
Blog Gardenhttp://www.cnblogs.com/JEEP711/
CSDN/Bloghttp://blog.csdn.net/jeep911
51CTO/Bloghttp://jeep711.blog.51cto.com/