網絡編程基本概念: UDP / TCP

基本概念

  • 網絡編程 : 網絡編程主要用于解決計算機與計算機(手機秃症、平板..)之間的數據傳輸問題
  • 網絡編程 : 不需要基于html頁面就可以達到數據之間的傳輸种柑。 比如: feiQ , QQ , 微信....
  • 網頁編程 : 就是要基于html頁面的基礎上進行數據的交互的。 比如: 珍愛網荠雕、 oa(辦公自動化)、 高考的報告系統(tǒng)...
  • 計算機網絡 : 分布在不同地域 的計算機通過外部設備鏈接起來達到了消息互通欢际、資源共享的效果就稱作為一個計算機網絡矾兜。
  • 網絡通訊的三要素:
    1. IP (192.168.10.1)
    2. 端口號
    3. 協議
IP
  • IP地址 : IP地址的本質就是一個由32位的二進制數據組成的數據患久。 后來別人為了方便我們記憶IP地址, 就把IP地址切成了4份, 每份8bit (2^8 = 0~255) // ipconfig->win獲取IP地址
    00000000-00000000-00000000-00000000
  • IP地址 = 網絡號+ 主機號
  • IP地址的分類 :
    • A類地址 = 一個網絡號 + 三個主機號 -> (2^24 政府單位)
    • B類地址 = 兩個網絡號 + 兩個主機號 -> (2^16 事業(yè)單位(學校蒋失、銀行..))
    • C類地址 = 三個網絡號 + 一個主機號 -> (2^8 私人使用..)
  • InetAddress(IP類)常用的方法:
    • getLocalHost(); 獲取本機的IP地址
    • getByName("IP或者主機名") 根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。 (用于獲取別人的IP地址對象)
    • getHostAddress() 返回一個IP地址的字符串表示形式
    • getHostName() 返回計算機的主機名
  • 子網掩碼的作用: 用來表明IP地址哪一個是網絡號, 哪一個是主機號
端口
  • 端口號是沒有類描述的, 端口號的范圍: 0~65535
    • 0~1023 : 系統(tǒng)緊密綁定于一些服務
    • 1024~65535 : 我們可以使用....
通訊協議
  • 網絡通訊的協議:
    • udp通訊協議
    • tcp通訊協議
public class Demo {
    public static void main(String[] args) throws UnknownHostException {
        //getLocalHost 獲取本機的IP地址對象
        /*InetAddress address = InetAddress.getLocalHost();
        System.out.println("IP地址:"+address.getHostAddress());
        System.out.println("主機名:"+address.getHostName());*/
        
        //獲取別人機器的IP地址對象
        //可以根據一個IP地址的字符串形式或者是一個主機名生成一個IP地址對象。
        InetAddress address = InetAddress.getByName("Jolly-pc140116");
        System.out.println("IP地址:"+address.getHostAddress());
        System.out.println("主機名:"+address.getHostName());

        InetAddress[]  arr = InetAddress.getAllByName("www.baidu.com");//域名
    }
}

UDP

  • 在java中網絡通訊業(yè)稱作為Socket(插座)通訊链韭,要求通訊 的兩臺器都必須要安裝Socket; 不同的協議就有不同的插座(Socket)

  • UDP通訊協議的特點:

    1. 將數據極封裝為數據包煮落,面向無連接
    2. 每個數據包大小限制在64K中
      3.因為無連接,所以不可靠
    3. 因為不需要建立連接旋讹,所以速度快
    4. UDP通訊是不分服務端與客戶端的轿衔,只分發(fā)送端與接收端
      <比如 : 物管的對講機, 飛Q聊天、 游戲...
  • UDP協議下的Socket:

    • DatagramSocket (UDP插座服務)
    • DatagramPacket (數據包類)
      • DatagramPacket(buf, length, address, port)
        • buf: 發(fā)送的數據內容
        • length : 發(fā)送數據內容的大小
        • address : 發(fā)送的目的IP地址對象
        • port : 端口號
  • 發(fā)送端的使用步驟:

    1. 建立UDP的服務
    2. 準備數據害驹,把數據封裝到數據包中發(fā)送, 發(fā)送端的數據包要帶上ip地址與端口號
    3. 調用UDP的服務裙秋,發(fā)送數據
    4. 關閉資源
public class Demo1Sender {
    
    public static void main(String[] args) throws IOException {
        //建立udp的服務
        DatagramSocket datagramSocket = new DatagramSocket();
        //準備數據,把數據封裝到數據包中进宝。
        String data = "第一個udp的例子..";
        //創(chuàng)建了一個數據包
        DatagramPacket packet = new DatagramPacket(data.getBytes(), data.getBytes().length,InetAddress.getLocalHost() , 9090);
        //調用udp的服務發(fā)送數據包
        datagramSocket.send(packet);
        //關閉資源 ---實際上就是釋放占用的端口號
        datagramSocket.close();
    }
}
  • 接收端的使用步驟
    1. 建立udp的服務
    2. 準備空 的數據 包接收數據枷恕。
    3. 調用udp的服務接收數據。
    4. 關閉資源
public class Demo1Receive {

    public static void main(String[] args) throws IOException {
        //建立udp的服務 未玻,并且要監(jiān)聽一個端口扳剿。
        DatagramSocket  socket = new DatagramSocket(9090);
        
        //準備空的數據包用于存放數據。
        byte[] buf = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); // 1024
        //調用udp的服務接收數據
        socket.receive(datagramPacket); //receive是一個阻塞型的方法锡搜,沒有接收到數據包之前會一直等待瞧掺。 數據實際上就是存儲到了byte的自己數組中了。
        System.out.println("接收端接收到的數據:"+ new String(buf,0,datagramPacket.getLength())); // getLength() 獲取數據包存儲了幾個字節(jié)肠缔。
        //關閉資源
        socket.close(); 
    }
}
  • 注意 : 如何使用tem運行一個java程序: 進入目錄, 報名+類型運行文件 eg: java my.UdpSender

TCP

  • TCP通訊協議特點:

    1. tcp是基于IO流進行數據 的傳輸 的哼转,面向連接
    2. tcp進行數據傳輸的時候是沒有大小限制的
    3. tcp是面向連接释簿,通過三次握手的機制保證數據的完整性。 可靠協議
    4. tcp是面向連接的庶溶,所以速度慢
    5. tcp是區(qū)分客戶端與服務端的
      比如 : 打電話偏螺、 QQ\feiQ的文件傳輸、 迅雷下載....
  • tcp協議下的Socket:

    • Socket(客戶端) : tcp的客戶端一旦啟動馬上要與服務端進行連接
    • ServerSocket(服務端類)
  • tcp的客戶端使用步驟:

    1. 建立tcp的客戶端服務
    2. 獲取到對應的流對象
      3.寫出或讀取數據
    3. 關閉資源
//tcp客戶端
public class DemoClinet {
    
    public static void main(String[] args) throws IOException{
        //建立tcp的服務
        Socket socket  = new Socket(InetAddress.getLocalHost(),9090);
        //獲取到Socket的輸出流對象
        OutputStream outputStream = socket.getOutputStream();
        //利用輸出流對象把數據寫出即可酿联。
        outputStream.write("服務端你好".getBytes());
        
        //獲取到輸入流對象夺巩,讀取服務端回送的數據柳譬。
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int length = inputStream.read(buf);
        System.out.println("客戶端接收到的數據:"+ new String(buf,0,length));
        
        //關閉資源
        socket.close();     
    }
}

tcp的服務端

  • java.net.BindException: 端口被占用

  • ServerSocket的使用步驟

    1. 建立tcp服務端 的服務
    2. 接受客戶端的連接產生一個Socket
    3. 獲取對應的流對象讀取或者寫出數據
    4. 關閉資源
  • 為什么ServerSocket不設計一個 getInputStream 與 getOutputStream 呢?

服務端是可以接受多用戶請求的, 如果設計getInputStream 與 getOutputStream方法, 那么多用戶所接受的信息將是相同的, 所以沒有設計getInputStream 與 getOutputStream方法

//服務端
public class DemoServer {

    public static void main(String[] args) throws Exception {
        //建立Tcp的服務端,并且監(jiān)聽一個端口销部。
        ServerSocket serverSocket = new ServerSocket(9090);
        //接受客戶端的連接
        Socket socket  =  serverSocket.accept(); //accept()  接受客戶端的連接 該方法也是一個阻塞型的方法舅桩,沒有客戶端與其連接時,會一直等待下去擂涛。
        //獲取輸入流對象歼指,讀取客戶端發(fā)送的內容甥雕。
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int length = 0;
        length = inputStream.read(buf);
        System.out.println("服務端接收:"+ new String(buf,0,length));
        
        //獲取socket輸出流對象,想客戶端發(fā)送數據
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("客戶端你好靶琛峭弟!".getBytes());
        
        //關閉資源
        serverSocket.close();
    }
}

模擬Tomcat服務器

public class TomcatDemo extends Thread {
    
    Socket socket;
    
    public TomcatDemo(Socket socket){
        this.socket = socket;
    }
    
    
    public void run() {
        try {
            //獲取socket的輸出流對象
            OutputStream outputStream = socket.getOutputStream();
            //把數據寫到瀏覽器上
            outputStream.write("<html><head><title>aaa</title></head><body>你好啊瀏覽器</body></html>".getBytes());
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    public static void main(String[] args) throws IOException {
        //建立tcp的服務端
        ServerSocket serverSocket = new ServerSocket(9090);
        //不斷的接受客戶端的連接
        while(true){
            Socket socket = serverSocket.accept();
            new TomcatDemo(socket).start();
        }
    }
    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末坷备,一起剝皮案震驚了整個濱河市情臭,隨后出現的幾起案子,更是在濱河造成了極大的恐慌竟秫,老刑警劉巖跷乐,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愕提,死亡現場離奇詭異,居然都是意外死亡纽谒,警方通過查閱死者的電腦和手機仗颈,發(fā)現死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來请祖,“玉大人,你說我怎么就攤上這事刷晋∩髁辏” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長润梯。 經常有香客問我,道長寇钉,這世上最難降的妖魔是什么舶赔? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任竟纳,我火速辦了婚禮,結果婚禮上征懈,老公的妹妹穿的比我還像新娘揩悄。我一直安慰自己,他們只是感情好亏娜,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布维贺。 她就那樣靜靜地躺著巴帮,像睡著了一般虐秋。 火紅的嫁衣襯著肌膚如雪垃沦。 梳的紋絲不亂的頭發(fā)上肢簿,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音桩引,去河邊找鬼收夸。 笑死,一個胖子當著我的面吹牛笛辟,可吹牛的內容都是我干的序苏。 我是一名探鬼主播捷凄,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跺涤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了航唆?” 一聲冷哼從身側響起院刁,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤退腥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后享潜,有當地人在樹林里發(fā)現了一具尸體嗅蔬,經...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年虐译,在試婚紗的時候發(fā)現自己被綠了吴趴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡厢拭,死狀恐怖供鸠,靈堂內的尸體忽然破棺而出陨闹,到底是詐尸還是另有隱情,我是刑警寧澤趋厉,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布君账,位于F島的核電站,受9級特大地震影響椭蹄,放射性物質發(fā)生泄漏净赴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一翼馆、第九天 我趴在偏房一處隱蔽的房頂上張望烧栋。 院中可真熱鬧审姓,春花似錦、人聲如沸魔吐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奥溺。三九已至,卻和暖如春骨宠,著一層夾襖步出監(jiān)牢的瞬間浮定,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工层亿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桦卒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓匿又,卻偏偏與公主長得像方灾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碌更,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內容

  • 個人認為裕偿,Goodboy1881先生的TCP /IP 協議詳解學習博客系列博客是一部非常精彩的學習筆記痛单,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評論 0 8
  • 1.這篇文章不是本人原創(chuàng)的嘿棘,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,063評論 6 174
  • 1.1 TCP/IP協議組 TCP/IP協議(傳輸控制協議)由網絡層的IP協議和傳輸層的TCP協議組成 IP層負責...
    F麥子閱讀 2,788評論 0 25
  • 同樣的蔫劣,本文篇幅也比較長,先來一張思維導圖个从,帶大家過一遍脉幢。 一、 計算機網絡體系結構分層 二嗦锐、 TCP/IP 基礎...
    滌生_Woo閱讀 65,034評論 38 1,038
  • 大家好嫌松! 我是小櫻、今天在這給大家分享一小段軟文引流法奕污。 這只是小櫻分享的一小部分喔萎羔!當然也歡迎大家加好友一起探討...
    熊寶小櫻閱讀 323評論 0 1