摘要:網(wǎng)絡(luò)層主要將從下層接收到的數(shù)據(jù)進(jìn)行地址例的封裝與解封裝。會(huì)話層通過(guò)傳輸層端口號(hào)傳輸端口與接收端口建立數(shù)據(jù)傳輸?shù)耐贰?/p>
第六階段 網(wǎng)絡(luò)編程
每一臺(tái)計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)連接起來(lái),達(dá)到了數(shù)據(jù)互動(dòng)的效果,而網(wǎng)絡(luò)編程所解決的問(wèn)題就是如何讓程序與程序之間實(shí)現(xiàn)數(shù)據(jù)的通訊與互動(dòng)(一) 網(wǎng)絡(luò)模型概述 (1) 兩大模型在嗎?你是GG還是MM?
網(wǎng)絡(luò)模型一般是指:
OSI(Open System Interconnection開(kāi)放系統(tǒng)互連)參考模型
TCP/IP參考模型
(2) 網(wǎng)絡(luò)模型七層概述物理層:主要定義物理設(shè)備標(biāo)準(zhǔn),如網(wǎng)線的接口類型、光纖的接口類型、各種傳輸介質(zhì)的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉(zhuǎn)化為電流強(qiáng)弱來(lái)進(jìn)行傳輸,到達(dá)目的地后在轉(zhuǎn)化為1、0,也就是我們常說(shuō)的數(shù)模轉(zhuǎn)換與模數(shù)轉(zhuǎn)換)。這一層的數(shù)據(jù)叫做比特。
數(shù)據(jù)鏈路層:主要將從物理層接收的數(shù)據(jù)進(jìn)行MAC地址(網(wǎng)卡的地址)的封裝與解封裝。常把這一層的數(shù)據(jù)叫做幀。在這一層工作的設(shè)備是交換機(jī),數(shù)據(jù)通過(guò)交換機(jī)來(lái)傳輸。
網(wǎng)絡(luò)層:主要將從下層接收到的數(shù)據(jù)進(jìn)行IP地址(例192.168.0.1)的封裝與解封裝。在這一層工作的設(shè)備是路由器,常把這一層的數(shù)據(jù)叫做數(shù)據(jù)包。
傳輸層:定義了一些傳輸數(shù)據(jù)的協(xié)議和端口號(hào)(WWW端口80等),如:TCP(傳輸控制協(xié)議,傳輸效率低,可靠性強(qiáng),用于傳輸可靠性要求高,數(shù)據(jù)量大的數(shù)據(jù)),UDP(用戶數(shù)據(jù)報(bào)協(xié)議,與TCP特性恰恰相反,用于傳輸可靠性要求不高,數(shù)據(jù)量小的數(shù)據(jù),如QQ微信聊天數(shù)據(jù)就是通過(guò)這種方式傳輸?shù)模?主要是將從下層接收的數(shù)據(jù)進(jìn)行分段和傳輸,到達(dá)目的地址后再進(jìn)行重組。常常把這一層數(shù)據(jù)叫做段。
會(huì)話層:通過(guò)傳輸層(端口號(hào):傳輸端口與接收端口)建立數(shù)據(jù)傳輸?shù)耐贰V饕?strong>在你的系統(tǒng)之間發(fā)起會(huì)話或者接受會(huì)話請(qǐng)求(設(shè)備之間需要互相認(rèn)識(shí)可以是IP也可以是MAC或者是主機(jī)名)
表示層:主要是進(jìn)行對(duì)接收的數(shù)據(jù)進(jìn)行解釋、加密與解密、壓縮與解壓縮等(也就是把計(jì)算機(jī)能夠識(shí)別的東西轉(zhuǎn)換成人能夠能識(shí)別的東西(如圖片、聲音等)。
應(yīng)用層: 主要是一些終端的應(yīng)用,比如說(shuō)FTP(各種文件下載),WEB(IE瀏覽),QQ之類的(可以把它理解成我們?cè)陔娔X屏幕上可以看到的東西.就是終端應(yīng)用)。
(二) 網(wǎng)絡(luò)編程三要素 (1) IP地址我們應(yīng)該或多或少都有見(jiàn)過(guò)IP地址的格式 xxx.xxx.xxx.xxx大致應(yīng)該是類似這樣的,但是計(jì)算機(jī)不是只能識(shí)別二進(jìn)制的數(shù)據(jù),但是很顯然,我們的IP地址確實(shí)不是二進(jìn)制的,這是什么原因呢?
我們先隨便拿一個(gè)IP地址舉個(gè)例子看看
IP:192.168.1.100
換算:11000000 10101000 00000001 01100100
但是如果我們?nèi)蘸笮枰玫竭@個(gè)IP地址的時(shí)候,記憶起來(lái)就比較麻煩,所以,為了方便表示IP地址,我們就把IP地址的每一個(gè)字節(jié)上的數(shù)據(jù)換算成十進(jìn)制,然后用 " . " 分開(kāi)來(lái)表示:"點(diǎn)分十進(jìn)制"
A類:第一號(hào)段為網(wǎng)絡(luò)號(hào)段+后三段的主機(jī)號(hào)段,一個(gè)網(wǎng)絡(luò)號(hào):256256256 = 16777216
B類:前二號(hào)段為網(wǎng)絡(luò)號(hào)段+后二段的主機(jī)號(hào)段,一個(gè)網(wǎng)絡(luò)號(hào):256*256 = 65536
C類:前三號(hào)段為網(wǎng)絡(luò)號(hào)段+后一段的主機(jī)號(hào)段,一個(gè)網(wǎng)絡(luò)號(hào):256
C:IP地址的分類
A類
1.0.0.1---127.255.255.254 (1)10.X.X.X是私有地址(私有地址就是在互聯(lián)網(wǎng)上不使用,而被用在局域網(wǎng)絡(luò)中的地址) (2)127.X.X.X是保留地址,用做循環(huán)測(cè)試用的
B類
128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址 169.254.X.X是保留地址
C類
192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D類
224.0.0.1---239.255.255.254
E類
240.0.0.1---247.255.255.254
兩個(gè)DOS命令
ipconfig 查看本機(jī)ip地址
ping 后面跟ip地址, 測(cè)試本機(jī)與指定的ip地址間的通信是否有問(wèn)題
特殊IP地址
127.0.0.1 回環(huán)地址(表示本機(jī))//也就是說(shuō),ping本機(jī)的IP地址相當(dāng)于ping 127.0.0.1
x.x.x.255 廣播地址
x.x.x.0 網(wǎng)絡(luò)地址
InetAddress的成員方法
//根據(jù)主機(jī)名或者IP地址的字符串表示得到IP地址對(duì)象 public static InetAddress getByName(String host):
import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressDemo { public static void main(String[] args) throws UnknownHostException { InetAddress address = InetAddress.getByName("192.168.24.1"); //獲取兩個(gè)東西:主機(jī)名,IP地址 String name = address.getHostName(); String ip = address.getHostAddress(); System.out.println(name + "---" + ip); } } //運(yùn)行結(jié)果 LAPTOP-5T03DV1G---192.168.24.1(2) 端口
物理端口 網(wǎng)卡口
邏輯端口 我們指的就是邏輯端口
每個(gè)網(wǎng)絡(luò)程序都會(huì)至少有一個(gè)邏輯端口
用于標(biāo)識(shí)進(jìn)程的邏輯地址,不同進(jìn)程的標(biāo)識(shí)
有效端口:0~65535,其中0~1024系統(tǒng)使用或保留端口。
(3) 協(xié)議TCP:傳輸控制協(xié)議,傳輸效率低,可靠性強(qiáng),用于傳輸可靠性要求高,數(shù)據(jù)量大的數(shù)據(jù)
UDP:用戶數(shù)據(jù)報(bào)協(xié)議,與TCP特性恰恰相反,用于傳輸可靠性要求不高,數(shù)據(jù)量小的數(shù)據(jù),如QQ微信聊天數(shù)據(jù)就是通過(guò)這種方式傳輸?shù)?/p>
簡(jiǎn)單總結(jié):
TCP:建立數(shù)據(jù)通道,無(wú)限制,效率低,可靠
UDP:數(shù)據(jù)打包,有限制,不連接,效率高,不可靠
(三) 控制臺(tái)簡(jiǎn)單聊天案例 (1) UDP版本 V1.0import java.io.IOException; import java.net.*; /* UDP協(xié)議發(fā)送數(shù)據(jù): * A:創(chuàng)建發(fā)送端Socket對(duì)象 * B:創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包 * C:調(diào)用Socket對(duì)象的發(fā)送方法發(fā)送數(shù)據(jù)包 * D:釋放資源 */ public class SendDemo { public static void main(String[] args) throws IOException { //創(chuàng)建socket對(duì)象 DatagramSocket ds = new DatagramSocket(); //創(chuàng)建數(shù)據(jù),并把數(shù)據(jù)打包 //DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] bys = "Hello,BWH!".getBytes();//把字符串轉(zhuǎn)換成字符數(shù)組 int length = bys.length; InetAddress address = InetAddress.getByName("192.168.24.1"); int port = 10086; //自擬 DatagramPacket dp = new DatagramPacket(bys, length, address, port); //調(diào)用Socket對(duì)象的方法發(fā)送數(shù)據(jù)包 //public void send(DatagramPacket p) ds.send(dp); //釋放資源 ds.close(); //底層依賴IO流,所以要釋放資源 } }
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; /* * UDP協(xié)議接收數(shù)據(jù): * A:創(chuàng)建接收端Socket對(duì)象 * B:創(chuàng)建一個(gè)數(shù)據(jù)包(接收容器) * C:調(diào)用Socket對(duì)象的接收方法接收數(shù)據(jù) * D:解析數(shù)據(jù)包,并顯示在控制臺(tái) * E:釋放資源 */ public class ReceiveDemo { public static void main(String[] args) throws IOException { // 創(chuàng)建接收端Socket對(duì)象 // DatagramSocket(int port) DatagramSocket ds = new DatagramSocket(10086); // 創(chuàng)建一個(gè)數(shù)據(jù)包(接收容器) // DatagramPacket(byte[] buf, int length) byte[] bys = new byte[1024]; int length = bys.length; DatagramPacket dp = new DatagramPacket(bys, length); // 調(diào)用Socket對(duì)象的接收方法接收數(shù)據(jù) // public void receive(DatagramPacket p) ds.receive(dp); // 解析數(shù)據(jù)包,并顯示在控制臺(tái) // 獲取對(duì)方的ip // public InetAddress getAddress() InetAddress address = dp.getAddress(); String ip = address.getHostAddress(); // public byte[] getData():獲取數(shù)據(jù)緩沖區(qū) // public int getLength():獲取數(shù)據(jù)的實(shí)際長(zhǎng)度 byte[] bys2 = dp.getData(); int len = dp.getLength(); String s = new String(bys2, 0, len); System.out.println(ip + ": " + s); // 釋放資源 ds.close(); } }(2) UDP 版本V2.0
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendDemo { public static void main(String[] args) throws IOException { //創(chuàng)建發(fā)送端的Socket對(duì)象 DatagramSocket ds = new DatagramSocket(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { if ("886".equals(line)) { break; } //創(chuàng)建數(shù)據(jù)并打包 byte[] bys = line.getBytes(); DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.24.1"), 10086); //發(fā)送數(shù)據(jù) ds.send(dp); } //釋放資源 ds.close(); } }
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveDemo { public static void main(String[] args) throws IOException { //創(chuàng)建接受端的Socket對(duì)象 DatagramSocket ds = new DatagramSocket(10086); while (true) { //創(chuàng)建一個(gè)包裹 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); //接收數(shù)據(jù) ds.receive(dp); //解析數(shù)據(jù) String ip = dp.getAddress().getHostAddress(); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + ": " + s); } // 釋放資源,但是接收端是服務(wù)器應(yīng)該一直開(kāi)啟 //ds.close(); } }(3) UDP 版本V3.0
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendThread implements Runnable { private DatagramSocket ds; public SendThread(DatagramSocket ds) { this.ds = ds; } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { if ("886".equals(line)) { break; } // 創(chuàng)建數(shù)據(jù)并打包 byte[] bys = line.getBytes(); DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.24.1"), 10086); // 發(fā)送數(shù)據(jù) ds.send(dp); } // 釋放資源 ds.close(); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveThread implements Runnable { private DatagramSocket ds; public ReceiveThread(DatagramSocket ds) { this.ds = ds; } @Override public void run() { try { while (true) { //創(chuàng)建一個(gè)包裹 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); //接收數(shù)據(jù) ds.receive(dp); //解析數(shù)據(jù) String ip = dp.getAddress().getHostAddress(); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println("from " + ip + " data is : " + s); } } catch (IOException e) { e.printStackTrace(); } } }
import java.net.DatagramSocket; import java.net.SocketException; public class ChatRoom { public static void main(String[] args) throws SocketException { DatagramSocket dsSend = new DatagramSocket(); DatagramSocket dsReceive = new DatagramSocket(10086); SendThread st = new SendThread(dsSend); ReceiveThread rt = new ReceiveThread(dsReceive); Thread t1 = new Thread(st); Thread t2 = new Thread(rt); t1.start(); t2.start(); } }(4) TCP版本
package cn.bwh_06_TCP2; import java.io.*; import java.net.Socket; public class Clietn { public static void main(String[] args) throws IOException { Socket s = new Socket("192.168.24.1", 22222); //鍵盤(pán)錄入對(duì)象 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //把通道內(nèi)的流包裝一下 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line = null; while ((line = br.readLine()) != null) { if ("886".equals(line)) { break; } bw.write(line); bw.newLine(); bw.flush(); } s.close(); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(22222); Socket s = ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } s.close(); } }(三) 其他功能 (1) 客戶端鍵盤(pán)錄入服務(wù)器寫(xiě)到文本文件
//封裝通道內(nèi)的數(shù)據(jù) BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //封裝文本文件 BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));(2) 客戶端讀取文本文件服務(wù)器控制臺(tái)輸出
//封裝文本文件 BufferedReader br = new BufferedReader(new FileReader("Demo.java")); //封裝通道內(nèi)的數(shù)據(jù) BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line = null; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); }結(jié)尾:
如果內(nèi)容中有什么不足,或者錯(cuò)誤的地方,歡迎大家給我留言提出意見(jiàn), 蟹蟹大家 !^_^
如果能幫到你的話,那就來(lái)關(guān)注我吧!(系列文章均會(huì)在公眾號(hào)第一時(shí)間更新)
在這里的我們素不相識(shí),卻都在為了自己的夢(mèng)而努力 ?一個(gè)堅(jiān)持推送原創(chuàng)Java技術(shù)的公眾號(hào):理想二旬不止
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/75489.html
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 923·2023-04-26 01:34
閱讀 3356·2023-04-25 20:58
閱讀 3260·2021-11-08 13:22
閱讀 2108·2019-08-30 14:17
閱讀 2522·2019-08-29 15:27
閱讀 2673·2019-08-29 12:45
閱讀 2996·2019-08-29 12:26
閱讀 2811·2019-08-28 17:51