主頁 > 移動端開發 > Java網路編程詳細筆記(附各類應用代碼)

Java網路編程詳細筆記(附各類應用代碼)

2020-11-08 12:10:33 移動端開發

1、概述

想要達到網路通訊效果需要什么:

  1. 如何準確定位網上的一臺主機,192.168.16.124: 埠,定位到這個計算機的某個資源
  2. 找到了這個主機,如何傳播資料

JavaWeb與網路編程的區別

JavaWeb:網頁編程 B/C. (Brower/Server)

網路編程:TCP/IP 使用 C/S 架構 (Client/Server)

2、IP

IP地址在 JavaInetAddress 類中

  • 唯一定位一臺網路上的計算機

  • 本機127.0.0.1: localhost.

    public static void main(String[] args) {
        try{
            //查詢本機地址
            InetAddress inetAddress1= InetAddress.getByName("127.0.0.1");
            System.out.println(inetAddress1);
    
            InetAddress inetAddress2= InetAddress.getByName("localhost");
            System.out.println(inetAddress2);
    
            InetAddress inetAddress3= InetAddress.getLocalHost();
            System.out.println(inetAddress3);
    
            //查詢網路ip地址
            InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress4);
    
        }catch (UnknownHostException e){
            e.printStackTrace();
        }
    }
    
    

3、網路通信協議

各個端間通信的標準,使得接收方和發送方對資料沒有歧義,同時規定端間資料傳輸的速率、包/幀結構、實作傳輸控制等,

3.1TCP

? TCP協議的特點是面向連接的通信協議,保證資料的安全和完整性即在傳輸資料前先在發送端和接收端建立邏輯連接,然后再傳輸資料,它提供了兩臺計算機之間可靠無差錯的資料傳輸,在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發出連接請求,每次連接的創建都需要經過“三次握手”,

  • 三次握手、 四次揮手,面向連接相對穩定,

  • 客戶端

    • 連接服務器Socket
    • 發送訊息
  • 服務器

    • 建立服務埠ServerSocket
    • 等待用戶的連接accept
    • 接受用戶的訊息

    客戶端:

package SunSocket;

import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class Socket_01 {
    public static void main(String[] args) throws Exception {
        //要知道服務器地址
        //InetAddress.getByName()
        InetAddress sAddress=InetAddress.getByName("127.0.0.1");
        //埠號
        int port=9999;
        //創建socket連接
        Socket socket=new Socket(sAddress,port);
        //發送訊息,IO流
        OutputStream stream = socket.getOutputStream();
        stream.write("我愛學網路通訊".getBytes());
        stream.write('\n');
        stream.write("我真的很愛學網路通訊".getBytes());
        stream.close();
        socket.close();
    }
}

服務端:

package SunSocket;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Socket_02 {
    public static void main(String[] args) throws Exception {
        //需要有一個地址
        ServerSocket serverSocket = new ServerSocket(9999);
        //等待客戶端連接
        Socket socket=serverSocket.accept();
        //讀取訊息
        InputStream is=socket.getInputStream();
        //管道流
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        byte[] buffer =new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            baos.write(buffer,0,len);
        }
        System.out.println(baos.toString());
        baos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lpZVndvF-1604669401312)(https://i.loli.net/2020/11/05/u4eJ7TqtkgIPcWU.png)]

3.2UDP

3.2.1發送訊息

? UDP協議的特點是面向無連接的通信協議,不保證資料的完整性,即在資料傳輸時,資料的發送端和接收端不建立邏輯連接,簡單來說,當一臺計算機向另外一臺計算機發送資料時,發送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會向發送端反饋是否收到資料,例如:我們的供屏軟體,

發送端:

package SunSocket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class UdpSocket_01 {
    public static void main(String[] args) throws Exception {
        //建立Socket
        DatagramSocket socket=new DatagramSocket();
        //打包資料包
        String msg="我愛學UDP協議";
        new DatagramPacket(msg.getBytes(),0,msg.getBytes().length);
        //發送
        InetAddress address= InetAddress.getByName("127.0.0.1");
        int post=9090;
        DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,address,post);
        socket.send(packet);
        socket.close();
    }
}

接受端:

package SunSocket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

//服務器端,等待客戶端的資料包
public class UdpSocket_02 {
    public static void main(String[] args) throws Exception {
        //開放埠
        DatagramSocket socket=new DatagramSocket(9090);
        //接受資料包
        byte[] buffer=new byte[1024];
        DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);//阻塞接受
        System.out.println(new String(packet.getData()));
        //關閉連接
        socket.close();
    }
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VzhKjP6K-1604669401315)(https://i.loli.net/2020/11/06/Y8ionwBpqGAm5lK.png)]

3.2.2回圈發送訊息

發送端:

package SunSocket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class UdpSocket_03 {
    public static void main(String[] args) throws Exception {
        //構造資料報套接字并將其系結到本地主機上的9999埠,
        DatagramSocket socket = new DatagramSocket(9999);
        while (true) {
            //準備資料,從控制臺讀取System.in
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String data = reader.readLine();
            //準備封裝發送包
            byte[] dataBytes = data.getBytes();
            //構造用于發送長度的分組的資料報包 length指定主機上到指定的埠號,
            //InetSocketAddress從IP地址和埠號創建套接字地址, 
            DatagramPacket packet = new DatagramPacket(dataBytes, 0, dataBytes.length, new InetSocketAddress("localhost", 6666));
            //發送
            socket.send(packet);
            if(data.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

接收端:

package SunSocket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpSocket_04 {
    public static void main(String[] args) throws Exception {
        //構造資料報套接字并將其系結到本地主機上的6666埠,
        DatagramSocket socket = new DatagramSocket(6666);
        while (true) {
            //準備接收包裹
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
            socket.receive(packet);//阻塞接受
            byte[] data = packet.getData();
            //此處的Length選用receivedPacket的Length,若選用data的Length,可能會變成1024,并沒有進行動態生成長度
            String receiveMsg = new String(data, 0, packet.getLength());
            System.out.println(receiveMsg);
            if (receiveMsg.equals("bye")) {
                break;
            }
        }
        socket.close();
    }
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BiUyLyXd-1604669401318)(https://i.loli.net/2020/11/06/K2V6EM18DzuWtH5.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nH7t9hIH-1604669401322)(https://i.loli.net/2020/11/06/NpPtJvxLVzsrnHQ.png)]

3.2.3多執行緒實作在線咨詢

發送端:

package SunSocket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UdpSocket_05 implements Runnable{
    DatagramSocket socket=null;
    BufferedReader reader=null;
    private int fromPost;
    private String toIp;
    private int toPost;

    public UdpSocket_05(int fromPost, String toIp, int toPost) {
        this.fromPost = fromPost;
        this.toIp = toIp;
        this.toPost = toPost;
        try{
            //構造資料報套接字并將其系結到本地主機上的9999埠,
            socket = new DatagramSocket(this.fromPost);
            //準備資料,從控制臺讀取System.in
            reader = new BufferedReader(new InputStreamReader(System.in));
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                String data = reader.readLine();
                //準備封裝發送包
                byte[] dataBytes = data.getBytes();
                //構造用于發送長度的分組的資料報包 length指定主機上到指定的埠號,
                //InetSocketAddress從IP地址和埠號創建套接字地址,
                DatagramPacket packet = new DatagramPacket(dataBytes, 0, dataBytes.length, new InetSocketAddress(this.toIp,this.toPost));
                //發送
                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

接收端:

package SunSocket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpSocket_06 implements Runnable{
    DatagramSocket socket;
    DatagramPacket packet;
    private String name;
    private int port;

    public UdpSocket_06(int port,String name) {
        this.port = port;
        this.name=name;
        try{
            socket=new DatagramSocket(this.port);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
        try{
                //準備接收包裹
                byte[] buffer = new byte[1024];
                packet = new DatagramPacket(buffer, 0, buffer.length);
                socket.receive(packet);//阻塞接受
                byte[] data = packet.getData();
                //此處的Length選用receivedPacket的Length,若選用data的Length,可能會變成1024,并沒有進行動態生成長度
                String receiveMsg = new String(data, 0, packet.getLength());
                System.out.println(name+":"+receiveMsg);
                if (receiveMsg.equals("bye")) {
                    break;
                }
        }catch (Exception e) {
            e.printStackTrace();
        }
        }
        socket.close();
    }
}


學生測驗:

package SunSocket;
//測驗多執行緒UDP1
public class UdpSocket_07 {
    public static void main(String[] args) {
        new Thread(new UdpSocket_05(7777,"127.0.0.1",8888)).start();
        new Thread(new UdpSocket_06(9999,"老師")).start();
    }
}

老師測驗:

package SunSocket;
//測驗UDP2
public class UdpSocket_08 {
    public static void main(String[] args) {
        new Thread(new UdpSocket_05(5555,"127.0.0.1",9999)).start();
        new Thread(new UdpSocket_06(8888,"學生")).start();
    }
}

image-20201106211611604

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OhoOcSrT-1604669401327)(https://i.loli.net/2020/11/06/F9wUW8dZ2cbjqCB.png)]

1.4URL

統一資源定位符:Uniform Resource Locator

協議://ip地址:埠//專案名/資源
package SunSocket;

import java.io.FileOutputStream;
        import java.io.InputStream;
        import java.net.HttpURLConnection;
        import java.net.URL;

public class Url_01 {
    public static void main(String[] args) throws Exception {
        //1、下載資源(引數為地址)
        URL url = new URL("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
        System.out.println(url.getProtocol());  //協議名
        System.out.println(url.getHost());  //IP名字
        System.out.println(url.getPort());   //埠號
        System.out.println(url.getPath());   //檔案
        System.out.println(url.getFile());   //檔案全路徑
        System.out.println(url.getQuery());   //引數

        //2、連接到這個資源 HTTP
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        InputStream is = urlConnection.getInputStream();

        FileOutputStream fos = new FileOutputStream("D:\\Desktop\\DownLoad.png");

        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1){
            fos.write(buffer,0,len);  //寫出這個資料
        }

        //關閉資源
        fos.close();
        is.close();
        urlConnection.disconnect();
    }
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5nkd24RK-1604669401327)(https://i.loli.net/2020/11/06/P8YtvkHTX9AcLfI.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lWghWs13-1604669401328)(https://i.loli.net/2020/11/06/r5OwjEfxtuSBaDl.png)]
自學習于嗶哩嗶哩狂神說JAVA(侵刪);

作為自己的筆記,歡迎大家斧正!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/206553.html

標籤:其他

上一篇:JAVA第十四課:網路編程

下一篇:《劍指offer》的編程思想

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more