JAVA 學(xué)習(xí)筆記之 網(wǎng)絡(luò)編程

網(wǎng)絡(luò)編程(理解)

  • 用編程語言來實(shí)現(xiàn)計(jì)算機(jī)的資源共享和信息傳遞碍遍。

    • 計(jì)算機(jī)網(wǎng)絡(luò):多臺(tái)獨(dú)立的計(jì)算機(jī)用網(wǎng)絡(luò)通信設(shè)備連接起來的網(wǎng)絡(luò)捻勉。
      • 實(shí)現(xiàn)資源共享和數(shù)據(jù)傳遞豁辉。
  • 網(wǎng)絡(luò)通信的三要素

* IP地址
    * 計(jì)算機(jī)在網(wǎng)絡(luò)中的唯一標(biāo)識(shí)庶橱。
    * 現(xiàn)在使用的是:"點(diǎn)分十進(jìn)制"
* 端口
    * 應(yīng)用程序的的標(biāo)記夷恍。
* 協(xié)議
    * 通信的規(guī)則。
 * UDP:不建立連接棉安,數(shù)據(jù)打包傳輸,數(shù)據(jù)有限制贡耽,數(shù)據(jù)不可靠,速度快。
 * TCP:建立連接,數(shù)據(jù)無限制,數(shù)據(jù)可靠,速度慢兜辞。
  • 網(wǎng)絡(luò)7層協(xié)議圖解

網(wǎng)絡(luò)7層協(xié)議.jpg
  • Socket通信概述圖解
Socket通信概述.jpg
  • UDP發(fā)送和接收數(shù)據(jù)圖解
UDP發(fā)送和接收數(shù)據(jù)圖解.jpg
  • UDP發(fā)送和接收數(shù)據(jù)
1. 先開啟誰都無所謂。
2. 發(fā)送端
 創(chuàng)建發(fā)送端的Socket服務(wù)對(duì)象。
  創(chuàng)建數(shù)據(jù)并把數(shù)據(jù)打包首量。
      發(fā)送數(shù)據(jù)琅捏。
      釋放資源。
3. 接收端
  創(chuàng)建接收端的Socket服務(wù)對(duì)象市俊。
  創(chuàng)建數(shù)據(jù)包蜒程。
  接收數(shù)據(jù)。
  解析數(shù)據(jù)。
  釋放資源。

案例一:UDP協(xié)議 鍵盤錄入數(shù)據(jù)服務(wù)器接收并顯示數(shù)據(jù)。

 //SendDemo發(fā)送demo

public class SendDemo {
   public static void main(String[] args) throws IOException {

   //創(chuàng)建Socket對(duì)象
   DatagramSocket  socket = new DatagramSocket();
   
    // public DatagramPacket(byte[] buf,int length,InetAddress address,int
    // port)
    // buf其實(shí)就是要發(fā)送的數(shù)據(jù)信息
    // length表示要發(fā)送的數(shù)據(jù)長(zhǎng)度
    // address數(shù)據(jù)要發(fā)到哪里去。對(duì)應(yīng)的那個(gè)IP地址對(duì)象
    // port端口號(hào)
   
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   
   String string = null;

   while ((string = reader.readLine()) != null ) {
    
       if ("886".equals(string)) {
           break;
       }

       byte[] by = string.getBytes();
       
       DatagramPacket p = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.3.108"), 10086);
       
       socket.send(p);
   }

   
   socket.close();
   }
}

ReceiveDemo接收demo

public class ReceiveDemo {
public static void main(String[] args) throws IOException {
    
    //創(chuàng)建接收對(duì)象 并指定端口
    DatagramSocket socket = new DatagramSocket(10086);
    
    while (true) {
    
        //創(chuàng)建接收數(shù)據(jù)包 接收數(shù)據(jù)
        byte[] by = new byte[1024];
        DatagramPacket p = new DatagramPacket(by, by.length);
    
        //接收數(shù)據(jù)
        socket.receive(p);
    
    //解析數(shù)據(jù)并顯示
    //InetAddress address = p.getAddress();
    //String ip = address.getHostAddress();
    
        byte[] byt = p.getData();
        String string = new String(byt, 0,p.getLength());
    
        System.out.println("獲得的數(shù)據(jù)是:" + string);
    }
    //關(guān)閉釋放資源
    //socket.close();
 }
}
  • UDP通訊簡(jiǎn)單使用多線程優(yōu)化

    • 直接看代碼

ChatRoom測(cè)試類

public class ChatRoom {
public static void main(String[] args) throws IOException {
    DatagramSocket dsSend = new DatagramSocket();
    DatagramSocket dsReceive = new DatagramSocket(11111);

    SendThread st = new SendThread(dsSend);
    ReceiveThread rt = new ReceiveThread(dsReceive);

    Thread t1 = new Thread(st);
    Thread t2 = new Thread(rt);

    t1.start();
    t2.start();
  }
}

接收數(shù)據(jù)類ReceiveThread

public class ReceiveThread implements Runnable {
private DatagramSocket ds;

public ReceiveThread(DatagramSocket ds) {
    this.ds = ds;
}

@Override
public void run() {
    try {
        while (true) {
            // 創(chuàng)建數(shù)據(jù)包
            byte[] bys = new byte[1024];
            DatagramPacket dp = new DatagramPacket(bys, bys.length);

            // 接收數(shù)據(jù)
            ds.receive(dp);

            // 解析數(shù)據(jù)
            String ip = dp.getAddress().getHostAddress();
            String data = new String(dp.getData(), 0, dp.getLength());
            System.out.println("from " + ip + " data is " + data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

發(fā)送數(shù)據(jù)類SendThread

public class SendThread implements Runnable {

  private DatagramSocket ds;

  public SendThread(DatagramSocket ds) {
    this.ds = ds;
  }

  @Override
  public void run() {
      try {
        // 封裝鍵盤錄入
        BufferedReader br = new BufferedReader(new InputStreamReader(
                System.in));
        String line = null;
        while ((line = br.readLine()) != null) {
            if ("886".equals(line)) {
                break;
            }

            // 創(chuàng)建數(shù)據(jù)包
            byte[] bys = line.getBytes();
            DatagramPacket dp = new DatagramPacket(bys, bys.length,
                    InetAddress.getByName("192.168.3.108"), 11111);
            // 發(fā)送數(shù)據(jù)
            ds.send(dp);
        }

        // 釋放資源
        ds.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
  }
}

TCP發(fā)送和接收數(shù)據(jù)

    必須先開啟服務(wù)器醉鳖。
    A:客戶端
            創(chuàng)建客戶端Socket對(duì)象。
            獲取輸出流。
            寫數(shù)據(jù)惊畏。
            釋放資源农曲。

    B:服務(wù)器端
            創(chuàng)建服務(wù)器Socket對(duì)象。
            監(jiān)聽客戶端連接合呐。
            獲取輸入流暮的。
            讀取數(shù)據(jù)。
            釋放資源淌实。
  • TCP協(xié)議發(fā)送和接收數(shù)據(jù)圖解
TCP協(xié)議發(fā)送和接收數(shù)據(jù)圖解.jpg

案例一:TCP協(xié)議 客戶端(ClientDemo)是鍵盤錄入冻辩,服務(wù)器(ServerDemo)是寫到文件猖腕。

ClientDemo 模擬客戶端

public class ClientDemo {
public static void main(String[] args) throws IOException {
    // 創(chuàng)建客戶端對(duì)象
    Socket s = new Socket("192.168.32.80", 12345);

    // 鍵盤錄入
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // 把通道內(nèi)的輸出流包裝
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));

    String line = null;
    while ((line = br.readLine()) != null) {
        if ("over".equals(line)) {
            break;
        }

        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    s.close();
}
}

ServerDemo 模擬服務(wù)器

public class ServerDemo {
public static void main(String[] args) throws IOException {
    // 創(chuàng)建服務(wù)器Socket對(duì)象
    ServerSocket ss = new ServerSocket(12345);
    // 監(jiān)聽客戶端連接
    Socket s = ss.accept();
    // 封裝通道內(nèi)的輸入流
    BufferedReader br = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    // 把數(shù)據(jù)寫到文件
    BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

    String line = null;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    bw.close();
    s.close();
    ss.close();
}
}

案例二:TCP協(xié)議 客戶端是讀取文件,服務(wù)器是寫到文件恨闪。反饋信息

ClientDemo 模擬客戶端

 public class ClientDemo {
public static void main(String[] args) throws IOException {
    // 創(chuàng)建客戶端對(duì)象
    Socket s = new Socket("192.168.32.80", 12345);

    // 讀取文件的數(shù)據(jù)
    BufferedReader br = new BufferedReader(new FileReader(
            "InetAddressDemo.java"));
    // 把通道內(nèi)的輸出流包裝
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));

    String line = null;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    // bw.write("你可以釋放了");
    // bw.newLine();
    // bw.flush();
    s.shutdownOutput(); // 禁用輸出流

    // 獲取服務(wù)器的反饋
    // 把通道內(nèi)的輸入流包裝
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    String data = reader.readLine(); // 阻塞式
    System.out.println("client:" + data);

    // 釋放資源
    br.close();
    s.close();
}
}

ServerDemo 模擬服務(wù)器

public class ServerDemo {
public static void main(String[] args) throws IOException {
    // 創(chuàng)建服務(wù)器對(duì)象
    ServerSocket ss = new ServerSocket(12345);

    // 監(jiān)聽客戶端連接
    Socket s = ss.accept();

    // 把通道內(nèi)的輸入流包裝
    BufferedReader br = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    // 把數(shù)據(jù)寫入文件
    BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

    String line = null;
    while ((line = br.readLine()) != null) { // 阻塞式
    // if("你可以釋放了".equals(line)){
    // break;
    // }
        
        bw.write(line);
        bw.newLine();
        bw.flush();
    }

    // 給客戶端一個(gè)反饋
    // 把通道內(nèi)的輸出流包裝
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));
    writer.write("文件上傳成功");
    writer.newLine();
    writer.flush();

    // 釋放資源
    bw.close();
    s.close();
    ss.close();
}
}

案例三:TCP協(xié)議 客戶端是讀取圖片倘感,服務(wù)器是寫到圖片。反饋信息

ClientDemo 模擬客戶端

public class ClientDemo {
public static void main(String[] args) throws IOException {
    // 窗口客戶端對(duì)象
    Socket s = new Socket("192.168.32.80", 12345);

    // 讀取圖片
    InputStream is = new FileInputStream("mn.jpg");
    // 寫到通道
    OutputStream os = s.getOutputStream();

    int by = 0;
    while ((by = is.read()) != -1) {
        os.write(by);
    }
    s.shutdownOutput();

    // 獲取服務(wù)器的反饋
    // 把通道內(nèi)的輸入流包裝
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
    String data = reader.readLine(); // 阻塞式
    System.out.println("client:" + data);

    // 釋放資源
    is.close();
    s.close();
}
}

ServerDemo 模擬服務(wù)器

public class ServerDemo {
public static void main(String[] args) throws IOException {
    // 創(chuàng)建服務(wù)器對(duì)象
    ServerSocket ss = new ServerSocket(12345);

    // 監(jiān)聽客戶端連接
    Socket s = ss.accept();

    // 獲取輸入流
    InputStream is = s.getInputStream();
    // 獲取輸出流
    OutputStream os = new FileOutputStream("copy.jpg");

    int by = 0;
    while ((by = is.read()) != -1) {
        os.write(by);
    }

    // 給出反饋
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
            s.getOutputStream()));
    writer.write("文件上傳成功");
    writer.newLine();
    writer.flush();

    os.close();
    s.close();
    ss.close();
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咙咽,一起剝皮案震驚了整個(gè)濱河市老玛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钧敞,老刑警劉巖蜡豹,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異溉苛,居然都是意外死亡镜廉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門愚战,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娇唯,“玉大人,你說我怎么就攤上這事凤巨∈永郑” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵敢茁,是天一觀的道長(zhǎng)佑淀。 經(jīng)常有香客問我,道長(zhǎng)彰檬,這世上最難降的妖魔是什么伸刃? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮逢倍,結(jié)果婚禮上捧颅,老公的妹妹穿的比我還像新娘。我一直安慰自己较雕,他們只是感情好碉哑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亮蒋,像睡著了一般扣典。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慎玖,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天贮尖,我揣著相機(jī)與錄音,去河邊找鬼趁怔。 笑死湿硝,一個(gè)胖子當(dāng)著我的面吹牛薪前,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播关斜,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼示括,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蚤吹?” 一聲冷哼從身側(cè)響起例诀,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裁着,沒想到半個(gè)月后繁涂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡二驰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年扔罪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桶雀。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矿酵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矗积,到底是詐尸還是另有隱情全肮,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布棘捣,位于F島的核電站辜腺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乍恐。R本人自食惡果不足惜评疗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茵烈。 院中可真熱鬧百匆,春花似錦、人聲如沸呜投。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仑荐。三九已至雕拼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間释漆,已是汗流浹背悲没。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工篮迎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留男图,地道東北人示姿。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逊笆,于是被迫代替她去往敵國(guó)和親栈戳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • title: 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)總結(jié)(1) tags: 網(wǎng)絡(luò) categories:筆記 date: 2017-06-1...
    行徑行閱讀 2,503評(píng)論 0 3
  • 1. 網(wǎng)絡(luò)編程概述 1.1 計(jì)算機(jī)網(wǎng)絡(luò) 是指將地理位置不同的具有獨(dú)立功能的多臺(tái)計(jì)算機(jī)及其外部設(shè)備难裆,通過通信線路連接...
    JackChen1024閱讀 1,033評(píng)論 0 3
  • 1.這篇文章不是本人原創(chuàng)的子檀,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,049評(píng)論 6 174
  • 個(gè)人認(rèn)為乃戈,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記褂痰,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評(píng)論 0 8
  • 定義 網(wǎng)絡(luò)協(xié)議為計(jì)算機(jī)網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)交換而建立的規(guī)則、標(biāo)準(zhǔn)或約定的集合症虑。網(wǎng)絡(luò)協(xié)議主要由三個(gè)要素組成:語義缩歪、語法及時(shí)...
    FlyAndroid閱讀 985評(píng)論 0 10