黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

網(wǎng)絡(luò)編程之udp

系統(tǒng) 2084 0

網(wǎng)絡(luò)編程之 udp

計算機網(wǎng)絡(luò),就是把分布在不同地理區(qū)域的計算機與專門的外部設(shè)備用通信線路互連成一個規(guī)模大、功能強的網(wǎng)絡(luò)系統(tǒng),從而使眾多的計算機可以方便地互相傳遞信息,共享硬件、軟件、數(shù)據(jù)信息等資源。

網(wǎng)絡(luò)體系結(jié)構(gòu):國際標準化組織 ISO l978 年提出“開放系統(tǒng)互連參考模型”,即著名的 OSI OpenSystemInterconnection )模型。該模型把計算機網(wǎng)絡(luò)分成物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層等七層。

通信協(xié)議
計算機網(wǎng)絡(luò)中實現(xiàn)通信必須有一些約定,即通信協(xié)議。對速率、傳輸代碼、代碼結(jié)構(gòu)、傳輸控制步驟、出錯控制等制定標準。

TCP 協(xié)議:提供可靠的數(shù)據(jù)傳輸服務(wù)的規(guī)則。

IP 協(xié)議進行 IP 數(shù)據(jù)包的分割和組裝。

但是通過 IP 協(xié)議并不能清楚地了解到數(shù)據(jù)包是否順利地發(fā)送給目標計算機。而使用 TCP 協(xié)議,它將數(shù)據(jù)包成功發(fā)送給目標計算機后,會要求發(fā)送一個確認,如果在某個時間內(nèi)沒有收到確認, TCP 將重新發(fā)送數(shù)據(jù)包。

首先了解一下神馬是 UDP 協(xié)議 ;

UDP(UserDatagramProtocol) 協(xié)議是用戶數(shù)據(jù)報,在網(wǎng)絡(luò)中它與 TCP 協(xié)議一樣用于處理數(shù)據(jù)包。在 OSI 模型中,在第四層——傳輸層,處于 IP 協(xié)議的上一層。

UDP 是一種無連接的協(xié)議,每個數(shù)據(jù)報都是一個獨立的信息,包括完整的源或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內(nèi)容的正確性都是不能被保證的。

為什么要使用 UDP

在網(wǎng)絡(luò)質(zhì)量令人不十分滿意的環(huán)境下, UDP 協(xié)議數(shù)據(jù)包丟失會比較嚴重。但是由于 UDP 的特性:它不屬于連接型協(xié)議,因而具有資源消耗小,處理速度快的優(yōu)點,所以通常音頻、視頻和普通數(shù)據(jù)在傳送時使用 UDP 較多,因為它們即使偶爾丟失一兩個數(shù)據(jù)包,也不會對接收結(jié)果產(chǎn)生太大影響。比如聊天用的 ICQ OICQ 就是使用的 UDP 協(xié)議。

上網(wǎng)搜索摸個網(wǎng)站的時候,本機是先訪問本地的 hosts 文件區(qū),去找該主機名是否有對應(yīng)的 ip 地址;

C:\Windows\System32\drivers\etc\hosts; 在里面可以加上你經(jīng)常進的網(wǎng)站和 ip

InetAddress :用于描述 IP 地址的對象

InetAddress 類沒有提供構(gòu)造方法,而是提供了兩個靜態(tài)方法來獲取 InetAddress 實例
getByName(Stringhost) :根據(jù)主機獲取對應(yīng)的 InetAddress 對象。
getByAddress(byte[]addr) :根據(jù)原始 IP 地址來獲取對應(yīng)的 InetAddress 對象。

// 將指定 ip 封裝成 InetAddress 對象。

InetAddressia=InetAddress.getByName("127.0.0.1");

Java 中操縱 UDP
使用位于 JDK Java.net 包下的 DatagramSocket DatagramPacket 類,可以非常方便地控制用戶數(shù)據(jù)報文。

每個數(shù)據(jù)包的大小限制在 64k 內(nèi);

面向無連接,是不可靠協(xié)議,容易丟包;

不需要連接,速度快;

DatagramSocket 類:創(chuàng)建接收和發(fā)送 UDP Socket 實例

DatagramSocket() :創(chuàng)建實例。通常用于客戶端編程,它并沒有特定監(jiān)聽的端口,僅僅使用一個臨時的。

DatagramSocket(intport) :創(chuàng)建實例,并固定監(jiān)聽 Port 端口的報文。

DatagramSocket(intport,InetAddresslocalAddr) :這是個非常有用的構(gòu)建器,當一臺機器擁有多于一個 IP 地址的時候,由它創(chuàng)建的實例僅僅接收來自 LocalAddr 的報文。

receive(DatagramPacketd) :接收數(shù)據(jù)報文到 d 中。 receive 方法產(chǎn)生一個“阻塞”。

send(DatagramPacketd) :發(fā)送報文 d 到目的地。

setSoTimeout(inttimeout) :設(shè)置超時時間,單位為毫秒。

close() :關(guān)閉 DatagramSocket 。在應(yīng)用程序退出的時候,通常會主動釋放資源,關(guān)閉 Socket ,但是由于異常地退出可能造成資源無法回收。所以,應(yīng)該在程序完成時,主動使用此方法關(guān)閉 Socket ,或在捕獲到異常拋出后關(guān)閉 Socket

建立一個 upd 的發(fā)送端。

用于發(fā)送數(shù)據(jù)。

1, 建立 updsocket 服務(wù)。

2 ,將數(shù)據(jù)封裝成數(shù)據(jù)包。

3 ,通過 socket 服務(wù)的 send 方法。將數(shù)據(jù)包發(fā)出。

4 ,關(guān)閉資源。

*/

//1, 建立 udpsocket 服務(wù)。

DatagramSocketds=newDatagramSocket;

//2, 將數(shù)據(jù)封裝成數(shù)據(jù)包。要使用 DatagramPacket 對象

//2.1 先將要發(fā)送的數(shù)據(jù)變成字節(jié)數(shù)組。在指定發(fā)送的目的地和端口。

//2.2 將這些信息作為參數(shù)傳遞給數(shù)據(jù)包對象的構(gòu)造函數(shù)。

byte[]bf=”hahah,wolaile”.getBytes[];

InetAdressip=InetAdress.getName(“192.168.49.111”);

DatagramPacketdp=newDatagramPacket(bf,bf.getLength,ip,9909);

//3, 使用 Socket 服務(wù)的 send 方法將數(shù)據(jù)包發(fā)送出去。

Ds.send(dp);

//4, 關(guān)閉資源。

ds.close;

/*

建立 udp 的接收端。

1 ,建立 udp 接收端服務(wù),必須要監(jiān)聽一個端口,因為要明確,哪個端口來的數(shù)據(jù)是由該應(yīng)用程序所處理的。

2 ,建立一個空的數(shù)據(jù)包,用于存儲接收到數(shù)據(jù),

將字節(jié)數(shù)據(jù)存儲到數(shù)據(jù)包對象中,可以使用數(shù)據(jù)包對象的方法獲取不同的數(shù)據(jù)信息。

3 ,使用 Socket 服務(wù)的 receive 方法將接收到的數(shù)據(jù)存儲到數(shù)據(jù)包中。

4 ,通過數(shù)據(jù)包的方法獲取指定數(shù)據(jù)信息。

5 ,關(guān)閉資源。

*/

//1, 建立 updsocket 服務(wù),監(jiān)聽一個端口。

DatagramSocketds=newDatagramSocket(9909);

//2, 建立一個執(zhí)行大小的數(shù)據(jù)包,用于存儲數(shù)據(jù),以便獲取。

byte[]bf=newbyte[1024];

DatagramPacketdp=newDatagramPacket(bf,bf.getLength);

//3, 使用 socket receive 方法將數(shù)據(jù)存儲到數(shù)據(jù)包中。

ds.receive();

//4, 通過數(shù)據(jù)包對象的方法獲取其中的數(shù)據(jù)。

Stringip=getAddress().getHostAdress();

Stringdata=newString(dp.getData(),0,dp.getLength);

intport=dp.getPort();

System.out.println(ip+”:”+data+”::”+port);

//5, 關(guān)閉資源。

ds.close();

      package com.csdn.hbsi;

/*


需求:

制作一個dos版的聊天程序。


1,對于聊天分兩個動作,接收和發(fā)送。

2,接收和發(fā)送都需要同時運行。這就使用到了多線程技術(shù)。

一個線程控制接收,一個線程控制發(fā)送。

3,既然要進行群聊。那么就要使用socket網(wǎng)絡(luò)服務(wù)。這里我們使用Udp完成。



*/


import java.net.*;

import java.io.*;


class ChatSend implements Runnable

{

                   private DatagramSocket ds;

          ChatSend(DatagramSocket ds)

    { 

           this.ds = ds;

     }

       public void run()

    {

          BufferedReader bufr = null;

      try

     {

          bufr = new BufferedReader(new InputStreamReader(System.in));


          String line = null;


     while((line=bufr.readLine())!=null)

    {

       if("886".equals(line))

       break;


      byte[] buf = line.getBytes();


      DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.49.255"),9008);


      ds.send(dp);

}
      ds.close();
}catch (Exception e)
{
System.out.println(e.toString());

    }
   } 

}



class ChatRece implements Runnable

{

       private DatagramSocket ds;

       ChatRece(DatagramSocket ds){
           this.ds = ds;

      

<!--EndFragment--> } 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(); String data = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+"::"+data); }catch (Exception e){ System.out.println(e.toString()); } } } } class ChatDemo { public static void main(String[] args) throws Exception{ DatagramSocket send = new DatagramSocket(); DatagramSocket rece = new DatagramSocket(9008); new Thread(new ChatSend(send)).start(); new Thread(new ChatRece(rece)).start(); } }


網(wǎng)絡(luò)編程之udp


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論