【Java基礎(chǔ)】java網(wǎng)絡(luò)編程

源代碼:https://gitee.com/AgentXiao/NetProgram

一、幾個(gè)概念

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

將不同區(qū)域的計(jì)算機(jī)連接到一起。簡(jiǎn)單氛圍局域網(wǎng)、城域網(wǎng)、互聯(lián)網(wǎng)

2、地址

即ip地址,確定計(jì)算機(jī)在網(wǎng)絡(luò)上的一個(gè)絕對(duì)位置。相當(dāng)于城市中的一棟房子

3、端口

區(qū)分計(jì)算機(jī)軟件的。例如計(jì)算機(jī)安裝了QQ、微信等不同軟件,使用端口號(hào)實(shí)現(xiàn)不同的軟件訪問不同的服務(wù)器。相當(dāng)于房子的窗戶,每個(gè)窗戶對(duì)應(yīng)不同的軟件。
特點(diǎn):(1)2個(gè)字節(jié) 0-65535 共65536個(gè)
(2)1024以下的不要使用,因?yàn)槭穷A(yù)留給計(jì)算機(jī)和各大廠商的,例如http -> 80,ftp -> 21

4、資源定位

統(tǒng)一資源定位符URL
統(tǒng)一資源URI

5、數(shù)據(jù)的傳輸

1)協(xié)議
TCP協(xié)議(transfer control protocol 傳輸控制協(xié)議)類比電話(面向連接,需要連接后才能通信)類似于三次握手,安全可靠但是效率低下
UDP協(xié)議(user datagram protocol 用戶數(shù)據(jù)包協(xié)議)類比短信(非面向連接,不需要建立連接也可以通信)不安全但是效率高
2)傳輸
先封裝、后拆封

二、類

底層還是流。學(xué)習(xí)網(wǎng)絡(luò)編程實(shí)際上還是學(xué)習(xí)類的使用。

1、InetAddress:封裝IP和DNS

這個(gè)類是沒有構(gòu)造方法的(構(gòu)造),但是提供了靜態(tài)方法用戶創(chuàng)建InetAddress對(duì)象。創(chuàng)建InetAddress對(duì)象的三種方式及常用方法如下:

        //InetAddress類沒有構(gòu)造方法,需要通過調(diào)用靜態(tài)方法進(jìn)行創(chuàng)建

        //根據(jù)getLocalHost方法創(chuàng)建InetAddress對(duì)象
        InetAddress addr = InetAddress.getLocalHost();//這是一個(gè)靜態(tài)方法
        System.out.println(addr.getHostName());//獲得計(jì)算機(jī)名
        System.out.println(addr.getHostAddress());//獲得IP地址

        //根據(jù)域名創(chuàng)建InetAddress對(duì)象
        addr = InetAddress.getByName("www.baidu.com");
        System.out.println(addr.getHostName());//獲得計(jì)算機(jī)名
        System.out.println(addr.getHostAddress());//獲得IP地址

        //根據(jù)IP地址創(chuàng)建InetAddress對(duì)象
        addr = InetAddress.getByName("183.232.231.172");
        System.out.println(addr.getHostName());//獲得計(jì)算機(jī)名。如果沒有解析,則返回自身
        System.out.println(addr.getHostAddress());//獲得IP地址

2、InetSocketAddress:封裝端口

這個(gè)類相比于InetAddress還封裝了端口號(hào):

        //通過構(gòu)造方法創(chuàng)建InetSocketAddress對(duì)象,指定地址和端口
        InetSocketAddress isa = new InetSocketAddress("localhost",9999);
        //hostname是字符串時(shí)實(shí)際上也是調(diào)用了InetAddress.getByName("127.0.0.1")
        //InetSocketAddress isa = new InetSocketAddress(InetAddress.getByName("127.0.0.1"),9999);
        System.out.println(isa.getPort());//獲得端口
        System.out.println(isa.getHostName());//獲得計(jì)算機(jī)名稱

        InetAddress addr = isa.getAddress();
        System.out.println(addr.getHostAddress());//獲得IP地址
        System.out.println(addr.getHostName());//獲得計(jì)算機(jī)名

3、URL

URI(Uniform resource identifier)統(tǒng)一資源標(biāo)識(shí)符,用來唯一的標(biāo)識(shí)一個(gè)資源。
URL(Uniform Resource Locator)統(tǒng)一資源定位器,它是一種具體的URI 。
URL由四部分組成:協(xié)議+存放資源的主機(jī)名稱+端口+資源文件名
java中的URL類:
1)常用構(gòu)造方法
URL(String spec) :絕對(duì)路徑構(gòu)建
URL(URL context, String spec) :相對(duì)路徑構(gòu)建
2)常用方法

        //絕對(duì)路徑構(gòu)建
        URL url = new URL("http://www.baidu.com:80/index.jsp#aa?username=jack");
        //相對(duì)路徑構(gòu)建
        //URL url = new URL("http://www.baidu.com:80/a/");
        //url = new URL(url,"b.jsp");
        System.out.println(url.toString());

        //常用方法
        System.out.println("協(xié)議"+url.getProtocol());
        System.out.println("域名"+url.getHost());
        System.out.println("端口"+url.getPort());
        System.out.println("資源"+url.getFile());
        System.out.println("相對(duì)路徑"+url.getPath());
        System.out.println("錨點(diǎn)"+url.getRef());
        System.out.println("參數(shù)"+url.getQuery());//如果存在錨點(diǎn)則返回null,因?yàn)閰?shù)被當(dāng)做了錨點(diǎn)的一部分
    }
}

3)流 openStream

        URL url = new URL("http://www.baidu.com");//默認(rèn)資源

        //獲得資源 網(wǎng)絡(luò)流
        InputStream is = url.openStream();

        //輸出:會(huì)亂碼
//        byte[] flush = new byte[1024];
//        int len = 0;
//        while(-1 != (len=is.read(flush))){
//            System.out.println(new String(flush,0,len));
//        }
//        is.close();

        //輸出,不亂碼
//        BufferedReader bf = new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"));
//        String msg = null;
//        while((msg = bf.readLine()) != null){
//            System.out.println(msg);
//        }
//        bf.close();


        //輸出到本地
        BufferedReader bf = new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("baidu.html"),"utf-8"));
        String msg = null;
        while((msg = bf.readLine()) != null){
            bw.append(msg);
            bw.newLine();
        }
        bw.flush();

        bw.close();
        bf.close();

4、UDP通信

以數(shù)據(jù)為中心 非面向連接 不安全 數(shù)據(jù)可能丟失 效率高

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

        //1、創(chuàng)建服務(wù)器端 + 端口
        DatagramSocket server = new DatagramSocket(8888);
        //2、準(zhǔn)備接收容器
        byte[] contains = new byte[1024];
        //3、封裝成包
        DatagramPacket packet = new DatagramPacket(contains,contains.length);
        //4、接收數(shù)據(jù)
        server.receive(packet);
        //5、分析數(shù)據(jù)
        byte[] data = packet.getData();
        int len = packet.getLength();
        System.out.println(new String(data,0,len));
        //6、釋放資源
        server.close();

服務(wù)器端
1)創(chuàng)建服務(wù)端 DatagramSocket 類+指定端口
2)準(zhǔn)備接收容器 字節(jié)數(shù)組 封裝 DatagramPacket
3)包 接收數(shù)據(jù)
4)分析
5)釋放資源

        //1、創(chuàng)建客戶端 + 端口(同一臺(tái)機(jī)器端口號(hào)不能重復(fù))
        DatagramSocket client = new DatagramSocket(6666);
        //2、準(zhǔn)備數(shù)據(jù)
        byte[] data = "我愛你".getBytes();
        //3、打包(發(fā)送的地點(diǎn)和端口)
        DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getByName("localhost"),8888);
        //4、發(fā)送
        client.send(packet);
        //5、釋放
        client.close();

5、Socket編程

基于tcp: 面向連接 安全 可靠 效率低 ,類似于打電話

Socket編程示意圖

服務(wù)器:ServerSocket類

        //1、創(chuàng)建服務(wù)器 指定端口
        ServerSocket server = new ServerSocket(8888);
        //2、接收客戶端連接 阻塞式
        Socket socket = server.accept();
        System.out.println("一個(gè)客戶端建立連接");
        //3、發(fā)送數(shù)據(jù)
        String msg = "歡迎使用";
//        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//        bw.write(msg);
//        bw.newLine();//加行結(jié)束符
//        bw.flush();

        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(msg);
        dos.flush();

客戶端:Socket類

 //1、創(chuàng)建客戶端 必須指定服務(wù)器端和端口
        Socket client = new Socket("localhost",8888);
        //2、接收數(shù)據(jù)
//        BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
//        System.out.println(br.readLine());//阻塞式方法,逐行讀取,需要讀取的數(shù)據(jù)有行結(jié)束符

        DataInputStream dis = new DataInputStream(client.getInputStream());
        System.out.println(dis.readUTF());

6、聊天室的設(shè)計(jì)

聊天室版本

在這里我寫了四個(gè)聊天室的版本,是循序漸進(jìn)的,不斷完善的。詳見源代碼。
版本1:
客戶端可以發(fā)送和接收數(shù)據(jù),但是只能實(shí)現(xiàn)單線程,就是只能實(shí)現(xiàn)一個(gè)用戶發(fā)送后再接收。
版本2:
客戶端新增發(fā)送和接收線程,兩者獨(dú)立工作,用戶可以實(shí)現(xiàn)發(fā)生和接收的分離。但是服務(wù)器端仍然只能接收一個(gè)用戶。
版本3:
改造服務(wù)器,為服務(wù)器添加用戶容器,可同時(shí)添加多個(gè)用戶及響應(yīng)多個(gè)用戶的數(shù)據(jù)發(fā)送和接收。
版本4:
新增私聊功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 計(jì)算機(jī)網(wǎng)絡(luò)概述 網(wǎng)絡(luò)編程的實(shí)質(zhì)就是兩個(gè)(或多個(gè))設(shè)備(例如計(jì)算機(jī))之間的數(shù)據(jù)傳輸。 按照計(jì)算機(jī)網(wǎng)絡(luò)的定義,通過一定...
    蛋炒飯_By閱讀 1,366評(píng)論 0 10
  • 網(wǎng)絡(luò)編程 網(wǎng)絡(luò)編程對(duì)于很多的初學(xué)者來說,都是很向往的一種編程技能,但是很多的初學(xué)者卻因?yàn)楹荛L(zhǎng)一段時(shí)間無法進(jìn)入網(wǎng)絡(luò)編...
    程序員歐陽閱讀 2,104評(píng)論 1 37
  • 5.31多云星期三。時(shí)間過得真快五月份就這樣過去了。今天下午下班回家看到她們英語又考砸了,女兒一放學(xué)就問她錯(cuò)了幾個(gè)...
    wanliwen閱讀 159評(píng)論 0 0
  • 一. 集成 二. 在極光官網(wǎng)上創(chuàng)建應(yīng)用,獲取key并上傳推送證書. 送你一步,去查看官網(wǎng)提供的步驟 三. 工程配置...
    Mccc_閱讀 1,781評(píng)論 0 4

友情鏈接更多精彩內(nèi)容