9、網(wǎng)絡(luò)

一汹桦、基本概念

  • 1鲁驶、網(wǎng)絡(luò)
    將不同區(qū)域的計(jì)算機(jī)連接到一起,按范圍的從小到大順序分成局域網(wǎng)舞骆、城域網(wǎng)钥弯、互聯(lián)網(wǎng)。
  • 2督禽、地址:IP地址寿羞,確定網(wǎng)絡(luò)上一個(gè)絕對(duì)的地址
  • 3、端口號(hào):區(qū)分計(jì)算機(jī)上各個(gè)軟件赂蠢,共2個(gè)字節(jié)绪穆,0-65535,共65536個(gè)端口號(hào)
    注意:
    • 3.1:在同一個(gè)協(xié)議下端口號(hào)不能重復(fù)虱岂,不同協(xié)議下可以重復(fù)
    • 3.2:1024一下的端口號(hào)是預(yù)留給一些知名廠商的玖院,最好不要使用。
  • 4第岖、資源定位:URL統(tǒng)一資源定位符难菌,URI表示統(tǒng)一資源,屬于URL的一部分蔑滓。
  • 5郊酒、數(shù)據(jù)的傳輸
    • 5.1 協(xié)議:TCP協(xié)議和UDP協(xié)議
      TCP:必須先連接上再通信,“三次握手”键袱。面向連接燎窘,安全可靠。但是效率相對(duì)低下蹄咖。類(lèi)似于打電話褐健。
      UDP:非面向連接,安全性較低澜汤,但是效率較高蚜迅。類(lèi)似于發(fā)短信舵匾。
    • 5.2 傳輸
      需要先封裝,接收到的數(shù)據(jù)需要拆分谁不。

二坐梯、相關(guān)類(lèi)的使用

2.1 InetAddress類(lèi)和InetSocketAddress類(lèi)

2.1.1 InetAddress類(lèi)

InetAddress類(lèi)封裝計(jì)算機(jī)的ip地址和DNS,不包含端口刹帕。

  • 1烛缔、靜態(tài)方法獲取對(duì)象:
InetAddress.getLocalHost();
InetAddress.getByName("www.163.com");
InetAddress.getByName("192.168.2.23");

這單個(gè)方法都返回InetAddress實(shí)例對(duì)象。

  • 2轩拨、方法
getHostAddress()返回ip
getHostName()返回域名践瓷,本機(jī)為計(jì)算機(jī)名

相關(guān)例子:

package cn.itcast.day185.InetAddress_InetSocketAddress;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetDemo01 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress addr = InetAddress.getLocalHost();
        System.out.println(addr.getHostAddress());//10.170.48.193
        System.out.println(addr.getHostName());//yj-PC
        
        addr = InetAddress.getByName("www.163.com");
        System.out.println(addr.getHostAddress());//219.145.184.60
        System.out.println(addr.getHostName());//www.163.com
        
        addr = InetAddress.getByName("219.145.184.60");
        System.out.println(addr.getHostAddress());//219.145.184.60
        System.out.println(addr.getHostName());//可能是219.145.184.60或者是www.163.com
    }
}

2.1.2 InetSocketAddress類(lèi)

InetSocketAddress是在InetAddress基礎(chǔ)上封裝了端口號(hào)。

  • 1亡蓉、靜態(tài)方法
public static InetSocketAddress createUnresolved(String host, int port)
  • 2晕翠、構(gòu)造器
public InetSocketAddress(InetAddress addr, int port)
public InetSocketAddress(String hostname, int port)//用的最多
public InetSocketAddress(int port)

相關(guān)例子:

package cn.itcast.day185.InetAddress_InetSocketAddress;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

public class InetSocketDemo01 {
    public static void main(String[] args) throws UnknownHostException {
        InetSocketAddress address = new InetSocketAddress("localhost", 9999);
        System.out.println(address.getHostName());//localhost
        System.out.println(address.getPort());//9999
        
        InetAddress addr = address.getAddress();
        System.out.println(addr.getHostAddress());//0:0:0:0:0:0:0:1
        System.out.println(addr.getHostName());//localhost  
    }
}

2.2 URL和URI

  • URI:統(tǒng)一資源標(biāo)識(shí)符,用來(lái)唯一的標(biāo)識(shí)一個(gè)資源
  • URL:統(tǒng)一資源定位器砍濒,是一種具體的URI淋肾,即包含URI
  • URL:由四部分組成
    協(xié)議(默認(rèn))爸邢,存放資源的主機(jī)域名樊卓,端口號(hào)(默認(rèn)是80),資源文件名URL類(lèi)杠河。創(chuàng)建用的比較多的是:
public URL(String spec)//絕對(duì)路徑構(gòu)建
public URL(URL context, String spec)//相對(duì)路徑構(gòu)建

例1:

package cn.itcast.day186.URL;
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo01 {
    public static void main(String[] args) throws MalformedURLException {
        
        //絕對(duì)路徑構(gòu)建
        URL url = new URL("http://www.baidu.com:80/index.html#aa?username=csdn");
        System.out.println("協(xié)議:" + url.getProtocol());//http
        System.out.println("域名: " + url.getHost());//www.baidu.com
        System.out.println("端口: " + url.getPort());//80
        System.out.println("資源: " + url.getFile());//  /index.html
        System.out.println("相對(duì)路徑: " + url.getPath());// /index.html
        System.out.println("錨點(diǎn): " + url.getRef());//aa?username=csdn
        System.out.println("參數(shù): " + url.getQuery());//存在錨點(diǎn)則為空null碌尔,否在返回正確
        
        //相對(duì)路徑構(gòu)建
        url = new URL("http://www.baidu.com/a/");
        url = new URL(url, "b.txt");
        System.out.println(url.toString());//http://www.baidu.com/a/b.txt
    }
}

例2:獲取網(wǎng)絡(luò)資源

package cn.itcast.day186.URL;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
//獲取資源:源代碼
public class URLDemo02 {
    public static void main(String[] args) throws IOException {
        
        URL url = new URL("http://www.baidu.com");//訪問(wèn)主頁(yè),即默認(rèn)資源
        
        //獲取資源網(wǎng)絡(luò)流
        /*InputStream in = url.openStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = in.read(buffer)) != -1){
            System.out.println(new String(buffer, 0, len));
        }
        in.close();*/
        
        //使用轉(zhuǎn)換流
        BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
        BufferedWriter bw = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream("C:\\Users\\yj\\Desktop\\test.html"), "UTF-8"));
        String message = null;
        while((message = br.readLine()) != null){
            //System.out.println(message);
            bw.append(message);
            bw.newLine();
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

說(shuō)明:這里獲取網(wǎng)絡(luò)資源比較簡(jiǎn)單券敌,主要注意url.openStream()的使用唾戚。

三、UDP

UDP以數(shù)據(jù)為中心待诅,不安全叹坦,非面向連接,數(shù)據(jù)可能丟失卑雁,但是效率較高募书。

3.1 類(lèi)DatagramSocket和DatagramPacket

使用步驟:

  • 1、客戶端
    (1)創(chuàng)建客戶端DatagramSocket類(lèi) + 指定端口
    (2)準(zhǔn)備數(shù)據(jù) 必須使用字節(jié)數(shù)組
    (3)打包DatagramPacket+服務(wù)器的地址和端口
    (4)發(fā)送
    (5)釋放資源

  • 2测蹲、服務(wù)器端
    (1)創(chuàng)建服務(wù)端DatagramSocket類(lèi)+ 指定端口
    (2)準(zhǔn)備接收的容器(字節(jié)數(shù)組)莹捡,封裝DatagramPacket
    (3)使用包接收數(shù)據(jù)
    (4)分析數(shù)據(jù)
    (5)釋放資源

  • 3、注意
    發(fā)送的數(shù)據(jù)一定要轉(zhuǎn)換成字節(jié)數(shù)組弛房,同時(shí)udp不是面向連接的道盏,就算服務(wù)端沒(méi)有開(kāi)啟而柑,客戶端這邊運(yùn)行也不會(huì)報(bào)錯(cuò)文捶。

下面通過(guò)一個(gè)例子進(jìn)行說(shuō)明荷逞,
客戶端:

package cn.itcast.day187.UDP;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
//客戶端
//注意:要先開(kāi)啟服務(wù)端,但是先開(kāi)啟客戶端也不會(huì)報(bào)錯(cuò)粹排,但是數(shù)據(jù)會(huì)丟失种远。因?yàn)椴皇敲嫦蜻B接的
public class MyClient {
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建客戶端+端口
        DatagramSocket client = new DatagramSocket(6666);//注意和服務(wù)端的端口不要沖突
        //2顽耳、準(zhǔn)備數(shù)據(jù)坠敷,數(shù)據(jù)必須是字節(jié)數(shù)組
        String message = "udp編程";
        
        //double 類(lèi)型,需要將double類(lèi)型轉(zhuǎn)換為字節(jié)數(shù)組
        double num = 89.12;
        
        //byte[] data = message.getBytes();
        byte[] data = convert(num);
        
        //3射富、將數(shù)據(jù)打包, 需要發(fā)送地址和端口
        DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 8888));
        //4膝迎、發(fā)送數(shù)據(jù)
        client.send(packet);
        //5、釋放資源
        client.close();
    }
    //double-->字節(jié)數(shù)組
    public static byte[] convert(double num) throws IOException{
        byte[] data = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        dos.writeDouble(num);
        dos.flush();
        
        //獲得數(shù)據(jù)
        data = bos.toByteArray();
        dos.close();
        
        return data;
    }
}

服務(wù)端:

package cn.itcast.day187.UDP;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//服務(wù)端
public class MyServer {
    
    public static void main(String[] args) throws IOException {
        //1胰耗、創(chuàng)建服務(wù)器+ 端口
        DatagramSocket server = new DatagramSocket(8888);//有可能端口被占用
        //2限次、準(zhǔn)備接收容器
        byte[] container = new byte[1024];
        //3、封裝成包柴灯,下面這個(gè)構(gòu)造函數(shù)是用來(lái)接收的
        DatagramPacket packet = new DatagramPacket(container, container.length);
        //4卖漫、接收數(shù)據(jù)
        server.receive(packet);
        //5、分析數(shù)據(jù)
        //byte[] data = packet.getData();
        
        double data = convert(packet.getData());
        int len = packet.getLength();
        
        //System.out.println(new String(data, 0, len));
        System.out.println(data);
        
        //6赠群、釋放資源
        server.close();
    }
    
    //字節(jié)數(shù)組-->Data 輸入流
    public static double convert(byte[] data) throws IOException{
        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
        double num = dis.readDouble();
        dis.close();
        return num;
    }
}

說(shuō)明:主要的使用步驟在程序中已經(jīng)標(biāo)明羊始,要注意基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換成字節(jié)數(shù)組的方法。

四查描、TCP

socket通信:我們可以將socket理解為服務(wù)端和客戶端之間的一條通道

  • (1)基于tcp協(xié)議突委,建立穩(wěn)定連接的點(diǎn)對(duì)點(diǎn)的通信
    實(shí)時(shí)、快速冬三、安全性高鸯两、占用系統(tǒng)資源多、效率低
  • (2)請(qǐng)求-響應(yīng) 模式
    • 客戶端(Socket
      在網(wǎng)絡(luò)通信中长豁,第一次主動(dòng)發(fā)起通訊的程序被稱(chēng)作客戶端程序钧唐,客戶端的端口是自動(dòng)分配的
    • 服務(wù)端(ServerSocket
      第一次通訊中等待連接的程序被稱(chēng)作服務(wù)端程序,服務(wù)端的端口需要我們自己指定

相關(guān)例子
客戶端:

package cn.itcast.day189.socket_;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
//必須先啟動(dòng)服務(wù)器后連接
public class MyClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //1匠襟、創(chuàng)建客戶端钝侠,必須指定服務(wù)器+端口,此時(shí)就在連接酸舍,如果不啟動(dòng)服務(wù)器則會(huì)報(bào)異常
        Socket socket = new Socket("localhost", 8888);
        //2.接收數(shù)據(jù)
        /*BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String message = br.readLine();//阻塞式方法帅韧,在讀取數(shù)據(jù)時(shí)必須要有行結(jié)束符*/
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String message = dis.readUTF();
        System.out.println(message);
    }
}

服務(wù)端:

package cn.itcast.day189.socket_;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
    
    public static void main(String[] args) throws IOException {
        //1、創(chuàng)建服務(wù)端啃勉,指定端口,這里可以指定端口為8888忽舟,即使客戶端也是用8888,因?yàn)椴煌瑓f(xié)議端口可以重復(fù)
        ServerSocket serverSocket = new ServerSocket(8888);
        //2、接收客戶端的連接叮阅,阻塞式的
        Socket socket = serverSocket.accept();
        System.out.println("一個(gè)客戶端建立連接");//當(dāng)運(yùn)行程序刁品,然后在瀏覽器訪問(wèn)此端口,則會(huì)打印
        
        //3.發(fā)送數(shù)據(jù)和接收數(shù)據(jù)
        String message = "歡迎使用";
        /*
        //輸出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(message);
        bw.newLine();//向流中添加一個(gè)行結(jié)束符
        bw.flush();
        //不要關(guān)閉
        */
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(message);
        dos.flush();    
    }
}

說(shuō)明:這里我們只是給出了最基本的使用方法浩姥,更深層次的內(nèi)容還需要再研究挑随。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市勒叠,隨后出現(xiàn)的幾起案子兜挨,更是在濱河造成了極大的恐慌,老刑警劉巖眯分,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拌汇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弊决,警方通過(guò)查閱死者的電腦和手機(jī)担猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丢氢,“玉大人傅联,你說(shuō)我怎么就攤上這事【尾欤” “怎么了蒸走?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)貌嫡。 經(jīng)常有香客問(wèn)我比驻,道長(zhǎng),這世上最難降的妖魔是什么岛抄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任别惦,我火速辦了婚禮,結(jié)果婚禮上夫椭,老公的妹妹穿的比我還像新娘掸掸。我一直安慰自己,他們只是感情好蹭秋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布扰付。 她就那樣靜靜地躺著,像睡著了一般仁讨。 火紅的嫁衣襯著肌膚如雪羽莺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天洞豁,我揣著相機(jī)與錄音盐固,去河邊找鬼荒给。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刁卜,可吹牛的內(nèi)容都是我干的志电。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼长酗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溪北!你這毒婦竟也來(lái)了桐绒?” 一聲冷哼從身側(cè)響起夺脾,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茉继,沒(méi)想到半個(gè)月后咧叭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烁竭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了派撕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镀赌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出商佛,到底是詐尸還是另有隱情,我是刑警寧澤良姆,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站玛追,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏闲延。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一慨代、第九天 我趴在偏房一處隱蔽的房頂上張望邢笙。 院中可真熱鬧,春花似錦侍匙、人聲如沸氮惯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妇汗。三九已至帘不,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杨箭,已是汗流浹背寞焙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留互婿,地道東北人捣郊。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像慈参,于是被迫代替她去往敵國(guó)和親呛牲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理驮配,服務(wù)發(fā)現(xiàn)娘扩,斷路器,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • 1. 網(wǎng)絡(luò)編程概述 1.1 計(jì)算機(jī)網(wǎng)絡(luò) 是指將地理位置不同的具有獨(dú)立功能的多臺(tái)計(jì)算機(jī)及其外部設(shè)備壮锻,通過(guò)通信線路連接...
    JackChen1024閱讀 1,037評(píng)論 0 3
  • 情人節(jié)那天起快耿,不再擔(dān)心沒(méi)有情人柴信,而是擔(dān)心自己的命運(yùn)议惰,人生一輩子轉(zhuǎn)折點(diǎn)就那么幾次厘肮。且行且珍惜后室。 ??? 上...
    大朵叨叨閱讀 339評(píng)論 2 3
  • 今天是特種兵培訓(xùn)第二天雨让,今天的主題一直都是我們做微商講課的重點(diǎn)話題嚷堡,今天再次聽(tīng)一遍尸变,收貨還是很大义图。 今天下午出門(mén)去...
    希希媽咪愛(ài)閱讀 191評(píng)論 0 0
  • 匯總 滑動(dòng)條控件.步進(jìn)控件.開(kāi)關(guān)控件.選項(xiàng)卡控件 UISlider 滑動(dòng)條 //1.UISlider滑塊控件UIS...
    nothing_c閱讀 262評(píng)論 0 0