探索Java中的網絡編程技術

2021-02-14 程式設計師小灰


本文轉載自公眾號  達叔與他的朋友們

前言

感謝! 承蒙關照~

探索Java中的網絡編程技術

網絡編程就是io技術和網絡技術的結合,網絡模型的定義,只要共用網絡模型就可以兩者連接.網絡模型參考.

一座塔有七層,我們需要闖關.

第一層物理層->第二層數據鏈路層->第三層網絡層->第四層傳輸層->第五層會話層->第六層表示層->第七層應用層.

物理層是主要定義物理設備標準,數據鏈路層是主要講從物理層接收的數據進行MAC地址(網卡的地址)的封裝與解封裝.這層的數據較幀.

網絡層是將從下層接收到的數據進行IP位址的封裝和解封裝.傳輸層是定義一些傳輸數據的協議和埠號.

會話層是將通過傳輸層建立數據傳輸的通路.表示層是進行對接收的數據進行解釋,加密與解密.

應用層主要是一些終端的應用.

應用層 --> 傳輸層 --> 網絡層 --> 主機至網絡層

電腦通訊要點:
一需要IP位址:InetAddress(網際網路協議即是規則)
二需要埠號
三需要傳輸協議

IP位址,網絡中設備的標識,不容易記住,可以用主機名,本地迴環地址: 127.0.0.1 主機名就是 localhost了.所謂區域網就是局部範圍內的,網際網路就是全球的.

埠號是用來標識進程的邏輯地址,不同進行的標識,有效的埠為0到65535,其中0到1024系統使用或保留的埠.

傳輸協議即是通訊的規則,常見的協議為TCP, UDP.

java.net

類 InetAddress

java.lang.Object
-> java.net.InetAddress

所有已實現的接口有:

直接已知子類:

Inet4Address, Inet6Address

public class InetAddress extends Object implements Serializable

這個類表示網際網路協議已地址.

Class Inet6Address

java.lang.Object
java.net.InetAddress
java.net.Inet6Address

public final class Inet6Address extends InetAddress

獲取ip地址:

public class IPDemo {
public static void main(String[] args) throws UnknownHostException {
 
 InetAddress ip = InetAddress.getLocalHost();
 System.out.println(ip.getHostAddress() + ":" + ip.getHostName());
}
}

域名解析

C:WINDOWSsystem32driversetc

InetAddress方法類型方法說明booleanequals(Object obj)將此對象與指定對象進行比較byte[]getAddress()返回此InetAddress對象的原始ip地址.static InetAddress[]getAllByName(String host)給定主機的名稱,根據系統上配置的名稱服務返回其ip地址數組.static InetAddressgetByAddress(byte[] addr)給出原始IP位址的InetAddress對象static InetAddressgetByAddress(String host, byte[] addr)根據提供的主機名和ip地址創建InetAddressstatic InetAddressgetByName(String host)確定主機名稱的ip地址StringgetCanonicalHostName()獲取此ip地址的完全限定域名StringgetHostAddress()返回文本顯示中的ip地址字符串StringgetHostName()獲取此ip地址的主機名網絡編程:

1,網絡模型:7層--->4層

用於標識進程的邏輯地址,不同進程的標識

有效埠:0到65535,而0到1024系統使用或保留埠

傳輸協議

常見協議TCP``UDP

TCP和UDP的區別:

TCP: 面向連接,通過三次握手完成,速度慢,可靠。
UDP: 面向無連接,速度快,不可靠。

UDP是將數據及其源和目的封裝成數據包中,不需要建立連接,每個數據報的大小在限制在64k內,因無連接,是不可靠的協議,不需要連接,但是速度快.

TCP是需要進行連接的,形成傳輸數據的通道,在連接中進行大數據量傳輸,通過三次握手完成連接,是可靠的協議,效率低即是速度慢一點.

網絡編程-Socket

網絡通訊的要素:

ip

傳輸協議

ip是用於標識網絡中主機的數字標識,而埠是用於標識應用程式的數字,還有傳輸協議是用於進行數據傳輸的規則.

實現UDP的通信,TCP傳輸:客戶端,服務端.

Socket是網絡服務提供的一種機制,是通信兩端必備的,都要有Socket,網絡通信其實就是Socket間的通信,數據在兩個Socket間通過io傳輸.

兩端發送端和接收端-UDP

UDP發送端Demo

public class UDPSend{
public static void main(String[] args){
 System.out.println("udp發送端");
}
}

DatagramSocket

public class DatagramSocket extends Object

此類表示用來發送和接收數據報包的套接字.

數據報套接字是包投遞服務的發送或接收點.每個在數據報套接字上發送或接收的包都是單獨編址和路由的.從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達.

在DatagramSocket上總是啟動UDP廣播發送.為了接收廣播包,將DatagramSocket綁定到通配符地址.

void receive(DatagramPacket p)
從此套接字接收數據報包
send(DatagramPacket p)
從此套接字發送數據報包

public class UDPSend{
public static void main(String[] args) throws IOException{
 System.out.println("udp發送端");
 DatagramSocket ds = new DatagramSocket();
 String text = "hello";
 byte[] buf = text.getBytes();
 
 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("123.23232.323.2"),10000);
 ds.send(dp);
 ds.close();
}
}



udp接收端

public class updDemo {
public static void main(String[] args) throws IOException {
 System.out.println("udp 接收端");
 
 
 DatagramSocket ds = new DatagramSocket();
 byte[] buf = new byte[1024];
 DatagramPacket dp = new DatagramPacket(buf, buf.length);
 ds.receive(dp);
 String ip = dp.getAddress().getHostAddress();
 int port = dp.getPort():
 String text = new String(dp.getData(),0,dp.getLength());
 
 ds.close();
}
}

receive

public void receive(DatagramPacket p) throws IOException
此套接字接收數據報包

實現UDP的通信,udp傳輸涉及的兩個對象,即可以發送,又可以接收.TCP傳輸:客戶端,服務端.

UDP鍵盤輸入

public class UDPSend {
   public static void main(String[] args) throws IOException {
       System.out.println("udp 發送端 run");

       DatagramSocket ds = new DatagramSocket(9999);

       BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
       String line = null;
       while((line=bufr.readLine())!=null){
           if("over".equals(line)){
               break;
           }
           byte[] buf = line.getBytes();

           DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.223"), 10001);

           ds.send(dp);
       }

       ds.close();
   }
}

public class UDPRece {
   public static void main(String[] args) throws IOException {
       System.out.println("udp2 接收端 run");
       DatagramSocket ds = new DatagramSocket(10001);
       while (true) {
           
           
           byte[] buf = new byte[1024];
           DatagramPacket dp = new DatagramPacket(buf, buf.length);
           ds.receive(dp);
           
           String ip = dp.getAddress().getHostAddress();
           int port = dp.getPort();
           String text = new String(dp.getData(), 0, dp.getLength());

           System.out.println(ip + ":" + port + ":" + text);
       }
       

   }
}

案例:

public class UDPChatTest {
   public static void main(String[] args) throws IOException {
       
       DatagramSocket sendSocket = new DatagramSocket();
       DatagramSocket receSocket = new DatagramSocket(10002);
       
       
       Send send = new Send(sendSocket);
       Rece rece = new Rece(receSocket);
       
       
       Thread t1 = new Thread(send);
       Thread t2 = new Thread(rece);
       t1.start();
       t2.start();
   }

}


class Send implements Runnable {

   private DatagramSocket ds;

   public Send(DatagramSocket ds) {
       super();
       this.ds = ds;
   }

   @Override
   public void run() {
       try {
           BufferedReader bufr = new BufferedReader(new InputStreamReader(
                   System.in));
           String line = null;
           while ((line = bufr.readLine()) != null) {
               byte[] buf = line.getBytes();
               DatagramPacket dp = new DatagramPacket(buf, buf.length,
                       InetAddress.getByName("1928.1.223"), 10002);
               ds.send(dp);
               if ("886".equals(line)) {
                   break;
               }
           }

           
           ds.close();
       } catch (IOException e) {

       }
   }
}


class Rece implements Runnable {

   private DatagramSocket ds;

   public Rece(DatagramSocket ds) {
       super();
       this.ds = ds;
   }

   @Override
   public void run() {
       while (true) {

           try {
               byte[] buf = new byte[1024];
               DatagramPacket dp = new DatagramPacket(buf, buf.length);
               ds.receive(dp);
               
               String ip = dp.getAddress().getHostAddress();
               int port = dp.getPort();
               String text = new String(dp.getData(), 0, dp.getLength());
               System.out.println(ip + ":" + port + ":" + text);
               if(text.equals("886")){
                   System.out.println(ip+"....離開聊天室");
               }
           } catch (IOException e) {

           }
       }

   }

}

tcp案例:

public class TCPClient {
   public static void main(String[] args) throws IOException {
       System.out.println("客戶端運行..");

       Socket s = new Socket("192.1.223",10003);


       OutputStream out = s.getOutputStream();

       out.write("hello tcp 來了!".getBytes());

       s.close();
   }
}

public class TCPServer {
   public static void main(String[] args) throws IOException {
       System.out.println("服務端開啟");
       ServerSocket ss = new ServerSocket(10003);
       while (true) {
           Socket s = ss.accept();
           String ip = s.getInetAddress().getHostAddress();

           InputStream in = s.getInputStream();
           byte[] buf = new byte[1024];
           int len = in.read(buf);
           String text = new String(buf, 0, len);
           System.out.println(text);
           s.close();
       }
   }
}

案例:

public class TCPClient2 {
   public static void main(String[] args) throws UnknownHostException, IOException {
       System.out.println("客戶端2 啟動..");
       Socket s = new Socket("192.1623", 10004);
       OutputStream out = s.getOutputStream();
       out.write("服務端,我來了".getBytes());
       InputStream in = s.getInputStream();
       byte[] buf = new byte[1024];
       int len = in.read(buf);
       String text = new String(buf,0,len);
       System.out.println(text);

       s.close();
   }
}

public class TCPSever2 {
   public static void main(String[] args) throws IOException {
       System.out.println("服務端2啟動");
       ServerSocket ss = new ServerSocket(10004);
       while (true) {
           
           Socket s = ss.accept();
           
           InputStream in = s.getInputStream();
           byte[] buf = new byte[1024];
           int len = in.read(buf);
           String text = new String(buf, 0, len);
           System.out.println(text);
           
           OutputStream out = s.getOutputStream();
           out.write("客戶端,我已到收到,哦耶!".getBytes());
           
           s.close();
       }
       

   }
}

達叔小生:往後餘生,唯獨有你
You and me, we are family !
90後帥氣小夥,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: 達叔小生
https://www.jianshu.com/u/c785ece603d1

—————END—————

喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師小灰,收看更多精彩內容

相關焦點

  • 工控上位機編程學習技巧
    幾年前,臺灣著名技術作家侯捷先生曾經寫過一篇影響很大的書評文章,叫做《MFC四大天王》。文章的意思是說在MFC的浩瀚書海中,只要認真研讀和學習其中四本,就可以「五嶽歸來不看山」。侯先生雖以MFC為例,但是這個道理卻同樣適合於MFC之外的很多具體技術領域,這不能不說是一個有趣的統計現象。
  • 怎樣能學好Java?在項目實戰中我漸漸成長
    現在管理信息系統的主流開發語言依然是Java,在Java編程方面已經有很多前輩總結了非常有價值的經驗,我也能非常幸運地站在巨人的肩膀上,這樣可以使我看得更遠。初學Java,我也根據前人總結的經驗,從JavaSE部分開始學起。在從網上找到比較系統的Java學習視頻後我便開始跟上練習敲代碼,在敲代碼的過程中,我也對在Java編程的道路上繼續前進充滿信心。
  • 汽修工來達內學習java技術,逆襲職場獲得10萬年薪
    據相關數據統顯示,目前,我國對軟體人才的需求以每年20%左右的速度增長,其中java開發作為IT軟體開發行業的職位之一,需求呈現爆炸式增長,再加上平均薪資明顯高於其他崗位2—3K,更讓java開發在市場上的變得炙手可熱。畢業於中國農業大學汽車修理專業的大專生小邵參加達內java培訓(java.tedu.cn)成功轉行,獲10萬年薪入職軟通動力,以高薪名企逆襲職場。
  • 【答疑解惑】java中static關鍵字的作用
    static方法static方法一般稱作靜態方法,由於靜態方法不依賴於任何對象就可以進行訪問
  • 你會Java中的Hello World嗎?
    隨著網際網路的高速發展,越來越多的小夥伴開始對編程感興趣,當然小編也是其中的一分子。疫情期間在家無聊,毫不猶豫地打開電腦開始了Java的學習。現在想學習編程,不得不說是真的很方便,在網上隨便一搜,就有好多的教程。小編也學了一個多月了,來給大家分享一些簡單的代碼的編程思路以及小白剛入門遇到的一些小問題和解決方法。
  • 推薦幾款可以直接在手機上編程的app(包含Java、C、Python等)
    點擊上方藍色字體,關注我們這裡介紹幾款可以在手機上編程的
  • 程式語言學哪個比較好?2019年最實用的程式語言
    學習編程關鍵是要找到一種合適的語言,那麼程式語言那麼多,該如何選擇?下面萬古網校小編為大家分享一篇關於程式語言選擇的文章,希望能給你帶來幫助!第一大類語言包括Java、C、Python和C++。這類語言都是非常通用的語言,它們並不局限於特定的編程平臺或用途。
  • 「原創」Java並發編程系列06|你不知道的final
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫final在Java中是一個保留的關鍵字,可以修飾變量、方法和類。那麼fianl在並發編程中有什麼作用呢?本文就在對final常見應用總結基礎上,講解final並發編程中的應用。
  • Java學到什麼程度才能叫精通?
    我個人覺得「精通」這個詞有點過,一般人是不會說自己精通某個東西,通常用熟練並掌握來說明你對某個技術有研究。下面是我總結的一些初中級Java程式設計師必備的知識:總結:初中級 Java 程式設計師必須掌握的知識。熟練掌握數據結構、算法、作業系統、計算機網絡等基礎知識。
  • 中國航信重慶研發中心IOS、Andorid、初級JAVA開發 、前端開發、軟體測試崗位
    中國航信重慶研發中心是中國航信下屬的重點研發機構,在公司一體化多層次研發體系中佔據重要位置,中心最早組建於2009年,2012年10月遷入重慶市兩江新區木星科技樓辦公。  重慶研發中心秉持「民主、求實、專業、高效」的管理理念,在團隊激勵機制和人才培養模式上不斷探索和創新。
  • 我的世界:在遊戲中玩遊戲,在遊戲中編程,既能學習又收穫快樂
    我們經常會在mc中學習到各種各樣的知識,收穫不同的樂趣。當我們使用各種指令的時候,是不是學習到了英語呢?我們在玩紅石的時候,是不是學習到了物理呢?其他還有很多情況。mc我的世界真的是一個很神奇的遊戲,既能讓我們放鬆,又能給我們一定的學習機會。
  • 線上與線下教育融合發展 KOOV探索機器人編程賽事新模式
    這是索尼連續第四屆在上海舉辦機器人編程賽事,值得關注的是,本次比賽進行了全新的嘗試——首次全程在線上舉行。主辦方將小選手們分別安排在各自的學校裡,並通過網絡即時下達比賽指令,使選手們同時開始製作。評委們則以直播的形式實時觀看小選手的賽場表現,並通過大屏幕遠程指導,最後綜合作品的完成度、創意度與小選手的表達能力進行線上打分。
  • java集合詳解合集
    Java集合類基本概念在編程中,常常需要集中存放多個數據。從傳統意義上講,數組是我們的一個很好的選擇,前提是我們事先已經明確知道我們將要保存的對象的數量。所以的集合類都位於java.util包下,後來為了處理多線程環境下的並發安全問題,java5還在java.util.concurrent包下提供了一些多線程支持的集合類。在學習Java中的集合類的API、編程原理的時候,我們一定要明白,"集合"是一個很古老的數學概念,它遠遠早於Java的出現。
  • 高級爬蟲實踐|記錄一次自動登錄淘寶網站 By Java
    一點廢話接上一篇文章(https://wenda.shukaiming.com/article/54),猿哥嘗試了很多種方式(包括切換瀏覽器和程式語言),暫時放棄使用 Facebook 的 PHP webdriver了。
  • 學Java前,你一定要知道這4點
    一、Java是什麼? 作為一門面向對象程式語言。Java程序的開發具備兼容性強和使用簡便的屬性,它實現了面向對象理論,並讓程式設計師在進行複雜的編程時能夠更顯優雅。 二、Java能做什麼 1、移動APP(安卓) 我們日常常見的APP應用,幾乎全都是由Java開發語言編寫的。
  • GitHub 上那些值得一試的 Java 開源庫
    我一直使用JAVA來寫後端應用,平時也會關注一些國外技術大牛的博客(來自Tapki、DZone、Google Developer等技術博客),從而注意到了一些新的而且很有意思Java開源庫,它們有些能給你的項目帶來幫助,有些是以遊戲的形式幫你提高Java的編程水平,而另一些則能夠幫助你識別JAVA程序中的常見問題 。
  • 知乎神回復:如果一定要在C+和Java中選擇,應該選擇哪一種?
    結論: (1)如果你是 計算機科班,大一學生,不需要立即找工作,想提高自己,那我的建議是: 把手上有關java 但是學習C++ 同樣會給你帶來很多收益(前提是學好的情況下): (1)你會變得自信,在有C++ 基礎上,學習go 1天,java的學習也就
  • 我要告訴你:java接口中可以定義private私有方法
    在傳統的Java編程中,被廣為人知的一個知識點是:java Interface接口中不能定義private私有方法。只允許我們定義public訪問權限的方法、抽象方法或靜態方法。但是從Java 9 開始,Interface 接口中允許定義私有方法和私有靜態方法。下面我們就來為大家介紹其語法規則,和為什麼要有這樣的設計。
  • 推薦一些有趣的在線編程遊戲
    雖然都是編程的基礎,但足夠讓玩家認識到遊戲開發的地基是如何建造的3.LintCodeLintCode 是面向求職的編程刷題網站,收集了最常見、最高頻的編程題目,還提供Google、螞蟻金服的內推資格。遊戲中你控制的單位被稱為「creeps」,它可以幫你獲得資源、建立自己的領地,遊戲中你的creeps會被其他玩家的creeps包圍。推薦率非常高,支持javaScripts,java,python,c++等語言,推薦用JS,體驗最好。這個遊戲要有編程基礎,只有英文版。遊戲部分免費,想繼續玩的話需要付費。
  • 正確的初始化,在 Java 編程中至關重要!
    有人說,你應該關注時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫「無聊