1. 程式人生 > >WIFI專案--【Java TCP/IP Socket】 — 單播、廣播、組播

WIFI專案--【Java TCP/IP Socket】 — 單播、廣播、組播

在當前網路通訊中(TCP/IP也不例外)有三種通訊模式:單播、廣播、組播(又叫多播, 個人感覺叫多播描述的有點不恰當),其中多播出現的時間最晚,但同時具備單播和廣播的優點,最具有發展前景。
通訊方式分類:
1.單播:單臺主機與單臺主機之間的通訊;
2.廣播:單臺主機與網路中所有主機的通訊;
3.組播:單臺主機與選定的一組主機的通訊;

單播:
單播是網路通訊中最常見的,網路節點之間的通訊 就好像是人們之間的對話一樣。如果一個人對另外一個人說話,
那麼用網路技術的術語來描述就是“單播”,此時資訊的接收和傳遞只在兩個節點之間進行。
1. 單播的優點:
(1)伺服器以及響應客戶端的請求;
(2)伺服器能針對每個客戶端的不同請求傳送不同的響應,容易顯示個性化服務;
2. 單播的缺點:
(1)伺服器針對每個客戶機發送資料流,伺服器流量=客戶機數量×客戶機流量;在客戶數量大、每個客戶機流量大的流媒體應用中伺服器不堪重負;
3. 應用場景:
單播在網路中得到了廣泛的應用,網路上絕大部分的資料都 是以單播的形式傳輸的。例如:收發電子郵件、遊覽網頁時,必須與郵件伺服器、
伺服器建立連線,此時使用的就是單播通訊方式;

廣播:
“廣播”可以比方為:一個人通過廣播喇叭對在場的全體說話(他才不管你是否樂意聽)。換句話說: 廣播是一臺主機對某一個網路上的所有主機發送資料報包。
這個網路可能是網路,也可能時子網,還有可能是所有子網。
廣播有兩類:本地廣播和定向廣播:
定向廣播:將資料報包傳送到本網路之外的特定網路的所有主機,然而,由於網際網路上的大部分路由器都不轉發定向廣播訊息,所以這裡不深入介紹了
本地廣播:將資料報包傳送到本地網路的所有主機,IPv4的本地廣播地址為“255.255.255.255”,路由器不會轉發此廣播;
1.廣播的優點:
(1)通訊的效率高,資訊一下子就可以傳遞到某一個網路上的所有主機。
(2)由於伺服器不用向每個客戶端單獨傳送資料,所以伺服器流量比較負載低;
2.廣播的缺點:
(1)非常佔用網路的頻寬;
(2)缺乏針對性,也不管主機是否真的需要接收該資料, 就強制的接收資料;
3.應用場景:
(1)有線電視就是典型的廣播型網路

組播:
”組播“可以比方為:你對著大街喊:”是男人的來一下,一人發一百塊”,那麼男的過來,女就不會過來,因為沒有錢發她不理你(組播:其中所有的男生就是一個組),
換句話說: 組播是一臺主機向指定的一組主機發送資料報包,因為如果採用單播方式,逐個節點傳輸,有多少個目標節點,就會有多少次傳送過程,這種方式顯然效率 極低,是不可取
的;如果採用不區分目標、全部發送的廣播方式,雖然一次可以傳送完資料,但是顯然達不到區分特定資料接收物件的目的,又會佔用網路頻寬。採用組播方式,既可以 實現一次傳送所
有目標節點的資料,也可以達到只對特定物件傳送資料的目的。
IP網路的組播一般通過組播IP地址來實現。組播IP地址就是D類IP地址,即224.0.0.0至239.255.255.255之間的IP地址。
1.組播的優點:
(1)具備廣播所具備的所有優點;
(2)與單播相比,提供了傳送資料報包的效率,與廣播相比,減少了網路流量;
2.組播的缺點:
(1)與單播協議相比沒有糾錯機制,發生丟包錯包後難以彌補,但可以通過一定的容錯機制和QOS加以彌補;

應用例項:
1.UDP單播的例子
[java] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;

// 客戶端
public class ClientTest
{
private static final int MAXRECEIVED = 255;

public static void main(String[] args) throws IOException  
{  
    byte[] msg = new String("connect test successfully!!!").getBytes();  

    DatagramSocket client = new DatagramSocket();  

    InetAddress inetAddr = InetAddress.getLocalHost();  
    SocketAddress socketAddr = new InetSocketAddress(inetAddr, 8888);  

    DatagramPacket sendPacket = new DatagramPacket(msg, msg.length,  
            socketAddr);  

    client.send(sendPacket);  

    client.close();  
}  

}

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Arrays;

//服務端
public class ServerTest
{
private static final int MAXREV = 255;

public static void main(String[] args) throws IOException  
{  
    DatagramSocket server = new DatagramSocket(8888);  
    DatagramPacket recvPacket = new DatagramPacket(new byte[MAXREV], MAXREV);  

    while (true)  
    {  
        server.receive(recvPacket);  

        byte[] receiveMsg = Arrays.copyOfRange(recvPacket.getData(),  
                recvPacket.getOffset(),  
                recvPacket.getOffset() + recvPacket.getLength());  

        System.out.println("Handing at client "  
                + recvPacket.getAddress().getHostName() + " ip "  
                + recvPacket.getAddress().getHostAddress());  

        System.out.println("Server Receive Data:" + new String(receiveMsg));  

        server.send(recvPacket);  

    }  

}  

}

2.UDP廣播的例子
[java] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//客戶端
public class BroadcastSender
{
public static void main(String[] args) throws IOException
{
byte[] msg = new String(“connection successfully!!!”).getBytes();
/*
* 在Java UDP中單播與廣播的程式碼是相同的,要實現具有廣播功能的程式只需要使用廣播地址即可, 例如:這裡使用了本地的廣播地址
*/
InetAddress inetAddr = InetAddress.getByName(“255.255.255.255”);
DatagramSocket client = new DatagramSocket();

    DatagramPacket sendPack = new DatagramPacket(msg, msg.length, inetAddr,  
            8888);  

    client.send(sendPack);  
    System.out.println("Client send msg complete");  
    client.close();  
}  

}

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Arrays;

//服務端
public class BroadcastReceive
{
public static void main(String[] args) throws IOException
{

    DatagramPacket receive = new DatagramPacket(new byte[1024], 1024);  
    DatagramSocket server = new DatagramSocket(8888);  

    System.out.println("---------------------------------");  
    System.out.println("Server current start......");  
    System.out.println("---------------------------------");  

    while (true)  
    {  
        server.receive(receive);  

        byte[] recvByte = Arrays.copyOfRange(receive.getData(), 0,  
                receive.getLength());  

        System.out.println("Server receive msg:" + new String(recvByte));  
    }  

}  

}

3.UDP組播的例子
[java] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

//客戶端
public class MulticastSender
{
public static void main(String[] args) throws IOException
{
int port = 8888;
byte[] msg = “Connection successfully!!!”.getBytes();

    InetAddress inetRemoteAddr = InetAddress.getByName("224.0.0.5");  

    /* 
     * Java UDP組播應用程式主要通過MulticastSocket例項進行通訊,它是DatagramSocket的是一個子類, 
     * 其中包含了一些額外的可以控制多播的屬性. 
     *  
     * 注意: 
     *  
     * 多播資料報包實際上可以通過DatagramSocket傳送,只需要簡單地指定一個多播地址。 
     * 我們這裡使用MulticastSocket,是因為它具有DatagramSocket沒有的能力 
     */  
    MulticastSocket client = new MulticastSocket();  

    DatagramPacket sendPack = new DatagramPacket(msg, msg.length,  
            inetRemoteAddr, port);  

    client.send(sendPack);  

    System.out.println("Client send msg complete");  

    client.close();  

}  

}

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Arrays;

//服務端
public class MulticastReceive
{
public static void main(String[] args) throws IOException
{
InetAddress inetRemoteAddr = InetAddress.getByName(“224.0.0.5”);

    DatagramPacket recvPack = new DatagramPacket(new byte[1024], 1024);  

    MulticastSocket server = new MulticastSocket(8888);  

    /* 
     * 如果是傳送資料報包,可以不加入多播組; 如果是接收資料報包,必須加入多播組; 這裡是接收資料報包,所以必須加入多播組; 
     */  
    server.joinGroup(inetRemoteAddr);  

    System.out.println("---------------------------------");  
    System.out.println("Server current start......");  
    System.out.println("---------------------------------");  

    while (true)  
    {  
        server.receive(recvPack);  

        byte[] recvByte = Arrays.copyOfRange(recvPack.getData(), 0,  
                recvPack.getLength());  

        System.out.println("Server receive msg:" + new String(recvByte));  
    }  

}  

}

相關推薦

WIFI專案--Java TCP/IP Socket廣播

在當前網路通訊中(TCP/IP也不例外)有三種通訊模式:單播、廣播、組播(又叫多播, 個人感覺叫多播描述的有點不恰當),其中多播出現的時間最晚,但同時具備單播和廣播的優點,最具有發展前景。 通訊方式分類: 1.單播:單臺主機與單臺主機之間的通訊;

Java TCP/IP SocketTCP Socket通信中由read返回值造成的的死鎖問題(含代碼)

ray inpu 網絡 數據 code public 文件讀取 情況 從服務器 書上示例 在第一章《基本套接字》中,作者給出了一個TCP Socket通信的例子——反饋服務器,即服務器端直接把從客戶端接收到的數據原原本本地反饋回去。

Java TCP/IP SocketTCP Socket(含代碼)

webkit -c round app code stat -m ride adl TCP的Java支持 協議相當於相互通信的程序間達成的一種約定,它規定了分組報文的結構、交換方式、包含的意義以及怎樣對報文所包含的信息進行解析,TCP/IP協議族有IP協議、TC

Java TCP/IP Socket基於線程池的TCP服務器(含代碼)

init 成對 之前 .get font ack 字符串 fonts exceptio 了解線程池 在http://blog.csdn.net/ns_code/article/details/14105457(讀書筆記一:TCP Socket)這篇博文中,服務器

Java TCP/IP Socket深入剖析socket——TCP套接字的生命周期

-i 指定 成了 上交 存在 initial com pos 技術分享 建立TCP連接 新的Socket實例創建後,就立即能用於發送和接收數據。也就是說,當Socket實例返回時,它已經連接到了一個遠程終端,並通過協議的底層實現完成了TCP消息或握手信息的交換。

Java TCP/IP Socket深入剖析socket——TCP通信中由於底層隊列填滿而造成的死鎖問題(含代碼)

parameter 兩個 因此 tar 機制 至少 基礎 named 測試 基礎準備 首先需要明白數據傳輸的底層實現機制,在http://blog.csdn.net/ns_code/article/details/15813809這篇博客中有詳細的介紹,在上面的博

Java TCP/IP Socket深入剖析socket——資料傳輸的底層實現

    底層資料結構     如果不理解套接字的具體實現所關聯的資料結構和底層協議的工作細節,就很難抓住網路程式設計的精妙之處,對於TCP套接字來說,更是如此。套接字所關聯的底層的資料結構集包含了

Java TCP/IP Socket基於NIO的TCP通訊(含程式碼)

   NIO主要原理及使用 NIO採取通道(Channel)和緩衝區(Buffer)來傳輸和儲存資料,它是非阻塞式的I/O,即在等待連線、讀寫資料(這些都是在一執行緒以客戶端的程式中會阻塞執行緒的操作)的時候,程式也可以做其他事情,以實現執行緒的非同步操作。    考

Java TCP/IP SocketUDP Socket(含程式碼)

UDP的Java支援     UDP協議提供的服務不同於TCP協議的端到端服務,它是面向非連線的,屬不可靠協議,UDP套接字在使用前不需要進行連線。實際上,UDP協議只實現了兩個功能:     1)在IP協議的基礎上添加了埠;     2)對傳輸過程中可能產生的資料錯誤

Java TCP/IP Socket應用程式協議中訊息的成幀與解析(含程式碼)

     程式間達成的某種包含了資訊交換的形式和意義的共識稱為協議,用來實現特定應用程式的協議叫做應用程式協議。大部分應用程式協議是根據由欄位序列組成的離散資訊定義的,其中每個欄位中都包含了一段以

Java TCP/IP Socket程式設計----綜述

    【Java TCP/IP Socket程式設計】的筆記系列內容完全來自於《Java TCP/IP Socket程式設計》一書,本書的作者是neth L. Calvert / Michael J. Donahoo,很多Java程式使用的框架會涉及網路程式設計的知識,比如Du

Java TCP/IP Socket程式設計----深入剖析----TCP套接字生命週期

目錄   簡介 TCP連線 關閉TCP連線 解調多路複用 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 簡介     新的Socket例項建立後(無論是通過公有的建構函式,或通過呼叫ServerSoc

Java TCP/IP Socket程式設計----深入剖析----TCP資料傳輸中的死鎖和效能

目錄   死鎖問題 資料傳輸效能 案例 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 死鎖問題 在TCP資料傳輸底層實現中(詳細參見https://blog.csdn.net/lili13897741554/article/

Java TCP/IP Socket程式設計----深入剖析----TCP資料傳輸底層實現

目錄   套接字底層資料結構 TCP資料傳輸底層實現 案例 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 套接字底層資料結構     要熟悉掌握網路程式設計,就需要理解套接字的具體實現所關聯的資料結構和底

Java TCP/IP Socket程式設計----NIO----TCP通道

NIO介紹 基本Java套接字對於小規模系統可以很好執行,涉及同時有上千個客戶端,就會出現問題,其中一客戶一執行緒的方式線上程的建立,維護和切換需要系統開銷較大,而使用執行緒池的方式雖然節省了一定的系統開銷,但是對於連線生存期比較長的協議,執行緒池的大小限制了系統可以同時服務的客戶端總數。隨著執

Java TCP/IP Socket程式設計----進階----注意點

1.廣播和多播:TCP套接字中客戶端只能接收和傳送指定伺服器端過來的資料,這種一對一的通訊方式叫單播,而UDP套接字可以容許一個傳送端和多個接收端情況,一對多的型別有:廣播和多播。       1)廣播:本地網路中所有的主機都會接收到一份資料副本。IPv4廣播地址(

Java TCP/IP Socket程式設計----進階----多工處理

簡介  基本的TCP相應伺服器是一次只能處理一個客戶端請求,無法處理同時多個客戶端請求,Java中多執行緒技術解決這一問題。多執行緒有兩種方式:一是一客戶一執行緒;二是執行緒池; 1)一客戶一執行緒:即為每個連線建立一個執行緒來處理,伺服器端會迴圈執行,監聽指定埠的連線,反覆接收來

Java TCP/IP Socket程式設計----傳送和接收資料----構建和解析協議訊息

--------筆記來自於書籍《Java TCP/IP Socket程式設計》。 簡介 使用套接字時,通常要麼是需要同時建立通訊通道兩端的程式,要麼實現一個給定的協議進行通訊。如果知道通訊雙方都使用java實現,且擁有對協議的完全控制權,那麼就可以使用Java的內建工具如Serialiabl

Java TCP/IP Socket程式設計----傳送和接收資料----訊息成幀與解析

目錄   簡介 成幀與解析 成幀技術案例 簡介 在程式中使用套接字向其他程式提供資訊或者使用其他程式提供的資訊,這就需要任何需要交換資訊的程式間在資訊編碼方式上達成共識(包含了資訊交換的形式和意義),稱為協議,用來實現特定的應用程式的協議叫應用程式協議。大部分應

Java TCP/IP Socket程式設計----套接字----UDP Socket

目錄   簡介 UDP通訊 UDP通訊案例 UDP套接字注意點 簡介 UDP是面向無連線的協議,在資料傳輸時,資料的傳送端和接收端不建立邏輯上的連線。當一臺計算機向另外一臺計算機發送資料時,傳送端不會確認接收端是否存在,同樣接收端接收到資料時,也不會發送反饋