java組播
㈠ java的MulticastSocket 多播只能用於區域網嗎
恩 組播應該是不行 而且組播需要路由協議的支持
qq用的是udp 他是利用中心伺服器進行打洞後建立起的p2p的udp鏈接
我猜想應該是登陸的時候鏈接一下中心伺服器 打洞成功後 以後你和好友間的聊天全是你們點對點的udp 就和伺服器關系不大了
如果編聊天軟體應該結合tcp和udp
㈡ java網路編程的基本內容有哪些其特點和優勢如何請進行論述。
1.用Java編寫網路程序是非常簡單的——至少比在現有其他編程環境下要簡單得多。本書的新版本帶給開發者的是Java發展的最新特性。一旦開始使用Java的網路API進行網路編程,我們能做到可以想像到的一切事情。 本書對開發網路程序進行了非常完整的介紹(從應用程序和applet兩方面),它包括了從網路基礎到遠程方法調用(RMI)的所有內容。本書的章節涵蓋了TCP和UDP套接字、組播、內容和協議處理器以及兩個新的API:JSSE(SSL實現)和JavaMail API。擴充了I/O和多線程等基礎知識。還講述了在不直接編寫網路代碼時你所能夠實現的內容,例如如何用URL實現自己的目標、applet的基本功能以及如何用Swing處理HTML。無論是有經驗的網路程序員還是只想隨意看一看的初學者,都會發現本書對於Java的網路程序類的學習是相當完整的。本書內容涵蓋了:1、Java 2(JDK 1.2和1.3)和Java1.1。2、許多完整的程序(可在線獲取)。3、網路編程基礎的所有方面。4、一些高級專題,包括RMI和組播。5、許多重要的API,有JSSE、JavaMail以及Swing中的HTML解析器。Elliotte Rusty Harold是著名的Java網站Cafe Au Lait的作者(http://metalab.unc.e/javafaq),國際知名的計算機專家。他是《Java I/O》以及其他一些Java和XML技術圖書的作者。 「直到找到這本書之後,我才開始真正理解Java網路編程。」——Bruce Eckel,《Java編程思想》的作者.
2.JAVA的特點§ 1.2 Java的特點
Java是一個廣泛使用的網路編程語言 ,它是一種新的計算概念。
首先 ,作為一種程序設計語言 ,它簡單、面向對象、不依賴於機器的結構、
具有可移植性、魯棒性、安全性、並且提供了並發的機制、具有很高的性能。其
次 ,它最大限度地利用了網路 ,Java的小應用程序 (applet)可在網路上傳輸而
不受 CPU和環境的限制。另外 ,Java還提供了豐富的類庫 ,使程序設計者可以很
方便地建立自己的系統。
下面我們分別從這三個方面來討論 Java的特點 ,然後通過把 Java與 C,
C++相比進一步指出它所具有的優點。
一、 Java語言
Java語言有下面一些特點 :簡單、面向對象、分布式、解釋執行、魯棒、
安全、體系結構中立、可移植、高性能、多線程以及動態性。
:1.簡單性
Java語言是一種面向對象的語言 ,它通過提供最基本的方法來完成指定的
任務 ,只需理解一些基本的概念 ,就可以用它編寫出適合於各種情況的應用程
序。 Java略去了運算符重載、多重繼承等模糊的概念 ,並且通過實現自動垃圾
收集大大簡化了程序設計者的內存管理工作。另外 ,Java也適合於在小型機上運
行 ,它的基本解釋器及類的支持只有 40KB左右 ,加上標准類庫和線程的支持也
只有 215KB左右。庫和線程的支持也只有 215KB左右。
2.面向對象
Java語言的設計集中於對象及其介面 ,它提供了簡單的類機制以及動態的
介面模型。對象中封裝了它的狀態變數以及相應的方法 ,實現了模塊化和信息
隱藏 ;而類則提供了一類對象的原型 ,並且通過繼承機制 ,子類可以使用父類
所提供的方法 ,實現了代碼的復用。
3.分布性
Java是面向網路的語言。通過它提供的類庫可以處理 TCP/IP協議 ,用戶
可以通過 URL地址在網路上很方便地訪問其它對象。
4.魯棒性
Java在編譯和運行程序時 ,都要對可能出現的問題進行檢查 ,以消除錯誤
的產生。它提供自動垃圾收集來進行內存管理 ,防止程序員在管理內存時容易
產生的錯誤。通過集成的面向對象的例外處理機制 ,在編譯時,Java提示出可能
出現但未被處理的例外 ,幫助程序員正確地進行選擇以防止系統的崩潰。另外,
Java在編譯時還可捕獲類型聲明中的許多常見錯誤 ,防止動態運行時不匹配問題
的出現。
5.安全性
用於網路、分布環境下的 Java必須要防止病毒的入侵。 Java不支持指針,
一切對內存的訪問都必須通過對象的實例變數來實現 ,這樣就防止程序員使用
"特洛伊 "木馬等欺騙手段訪問對象的私有成員 ,同時也避免了指針操作中容易
產生的錯誤。
6.體系結構中立
Java解釋器生成與體系結構無關的位元組碼指令 ,只要安裝了 Java運行時
系統 ,Java程序就可在任意的處理器上運行。這些位元組碼指令對應於 Java虛擬
機中的表示 ,Java解釋器得到位元組碼後 ,對它進行轉換 ,使之能夠在不同的平
台運行。
7.可移植性
與平台無關的特性使 Java程序可以方便地被移植到網路上的不同機器。
同時 ,Java的類庫中也實現了與不同平台的介面 ,使這些類庫可以移植。另外,
Java編譯器是由 Java語言實現的 ,Java運行時系統由標准 C實現 ,這使得Java
系統本身也具有可移植性。
8.解釋執行
Java解釋器直接對 Java位元組碼進行解釋執行。位元組碼本身攜帶了許多
編譯時信息 ,使得連接過程更加簡單。
9.高性能
和其它解釋執行的語言如 BASIC、 TCL不同 ,Java位元組碼的設計使之能
很容易地直接轉換成對應於特定CPU的機器碼 ,從而得到較高的性能。
10.多線程
多線程機制使應用程序能夠並行執行 ,而且同步機制保證了對共享數據
的正確操作。通過使用 多線程 ,程序設計者可以分別用不同的線程完成特定
的行為 ,而不需要採用全局的事件循環機制 ,這樣就很容易地實現網路上的實
時交互行為。
11.動態性
Java的設計使它適合於一個不斷發展的環境。在類庫中可以自由地加入
新的方法和實例變數而不會影響用戶程序的執行。並且 Java通過介面來支持
多重繼承 ,使之比嚴格的類繼承具有更靈活的方式和擴展性。
參考資料:http://chat.xwsy.com/wangshangjiaocheng/java/Java.htm
3.Java已用動態的交互應用軟體使Web栩栩如生。它使開發人員
具有『編寫一次到處運行TM」的巨大能力。而且,藉助其JavaAPI
及其編程語言上的Java虛擬機,它已產生一種分布信息的嶄新模式。
這種模式叫做Java企業計算,正在幫助各企業以各種不同的方法取
得競爭優勢。網管和控制已大大簡化。軟體分配基本上是免費的,
而且立即可實現。電子貿易已獲得。佔有成本大幅度降低。信息和
應用軟體到處可存取。
Java建立在簡單的前提基礎上,即所有微處理器都應講同一種
語言——所有內部採用晶元的產品都應能一起工作,無縫而方便地
共享信息。它已經改變企業和個人同Internet大交道的方式。現在,
它正在對消費類產品產生明顯的影響,而且從總體上更加深刻地影
響企業計算。
藉助Java,您可自由自在地使用您已擁有的硬體和軟體。這是因
為Java是獨立於平台的。它還可使您超越企業計算,使應用軟體在便
攜式計算機、信息亭、電視、蜂窩電話和其他大量設備上運行。
全世界的公司都已發現Java數不勝數的用途。所有用途可從其無
可比擬的能力,即提高可靠性、安全性和簡化各種不同計算產品和
環境的能力中受益非淺,而且節省的時間和費用十分可觀。
Java無處不在。它已擁有幾百萬個用戶,其發展速度要快於在它
以前的其他任何一種計算機產品。它可位於任何地方,而且能到處運
行。Java正在迅速被用做傳播信息的事實上標准,這是因為它既可給
企業,也可給最終用戶帶來似乎數不清的好處。
㈢ JAVA程序做broadcast
說的是你定義的地址不是組播地址吧
//選用專門為多播指定的D類IP地址(224.0.0.1到239.255.255.255)任選一個即可,用來創建一個多播組
public static final String DefaultMulticastGroupIP="230.1.1.1";
//使用指定的埠(一般選1024以上的埠號)只要是空閑埠即可,用於建立多播套接字。
public static final int DefaultMulticastGroupPort=1314;
㈣ java rtpstream怎麼用
1.出現Local Data AddressDoes not belong to any of this hosts local interfaces錯誤:
主要問題是發送視頻和音頻的程序需要在伺服器上運行,你可以選擇Win2000 Server 或者Win2003 Server,問題就解決了。
2.傳輸聲音和視頻的方法如下:
a.傳輸聲音或者視頻文件
編譯完AVTransmit2.java後,再命令提示符中輸入命令:java AVTransmit2 file:test.wav 224.224.123.123 22222(注意文件的類型是.wav 或者.mov 、.mpg的文件,不可以是.mp3、.rmvb等其他不支持的文件。傳輸支持文件格式有限,我也沒有辦法,應該在添加相關的插件就行了,希望大家提供幫助),其中test.wav即傳輸的文件名,224.224.123.123為多播地址,22222為埠號.
接收方法:編譯完AVReceive.java後,在命令提示符中輸入命令:java AVReceive 224.224.123.123/22222即可接受到聲音文件
b.傳輸麥克風的音頻,在傳輸之前先檢查電腦錄音控制的選項是否為麥克風.(步驟:打開桌面任務欄上的音量控制,選擇選項---->屬性----->調節音量選擇錄音,之後在下面的音量控制屬性中選中麥克風。單擊確定。接著跳到錄音控制,選擇麥克風就行了)。使用的命令是:java AVTransmit2 dsound:// 224.224.123.123 22222,此時就開始傳輸聲音了。
接收方法同上
c.傳輸攝相頭視頻,使用的命令為:java AVTransmit2 vfw://0 224.224.123.123 22222
接收方法同上
d.關於廣播、組播和單播
廣播:對於區域網廣播你可以使用廣播的地址,如你的子網掩碼是255.255.225.0,即C類的默認子網掩碼,你的廣播地址可以是192.168.3.255。(註:我的區域網ip地址分配為192.168.3.X)。如子網掩碼不同,你可以參照相關的網路常識自己推算。
接收時也使用多播地址來接受,假如發送方的機器地址為:192.168.3.46。發送時在發送放的機器上運行java AVTransmit2 file:test.wav 192.168.3.255 22222,接收時使用java AVReceive2 224.224.123.123 22222。才能完成接收.這和網上的說法不同,埠號不要填錯,地址任意。按網上的說法,使用的接收地址應為為192.168.3.46,可是我沒有成功,總是出現Local Data AddressDoes not belong to any of this hosts local interfaces的錯誤,而使用多播地址反而成功了。具體的參數我就不多介紹了,有問題可以給我留言。
組播:使用組播地址發送,組播地址接收即可
單播:假如你只想給某台機子發送,那麼就在發送方輸入命令,如:java AVTransmit2 file:test.wav 192.168.3.47 22222,這時你只會將聲音流文件發送給47號計算機。而接受時還是使用多播地址,如java AVReceive2 224.224.123.123 22222。這是就聽到聲音了。
總之,使用RTP傳輸,在接受時都在使用多播地址,在發送時根據情況而定,至於ttl你可以不去管它。不只大家是怎麼實現的,反正網上的資料讓我變的很失望,真正的成功源於實踐。下面摘取一段讓大家欣賞(盡信書則不如無書)
網上摘取:
Transmitting Audio and Video over RTP
The AVTransmit2 class is very similar to the VideoTransmit, but uses RTP managers
to send the video and audio streams.
Since the media tracks are transmitted in multiple sessions, you'll need to
use one Player per track on the receive side. Using JMStudio, you can
start multiple Players from the "File" menu using the "New Window"
item. Then either:
use the "Open URL..." item to open one RTP session per track. The URL to use is:
rtp://<sourceIP>:<port>/media
Where <sourceIP> is the IP address of the RTP session and the port
number is the same one that is used on the transmitting side.
OR
Open RTP session and specify <sourcIP> and <port>
How to run this sample
1. Run AVTransmit2 with the required 3 command line parameters
For example, we can use any of the following:
- java AVTransmit2 file:clips/clip01mpg.mpg 224.112.112.112 22222
2. To receive the transmission on the client side use JMStudio:
- use open RTP session and specify group: 224.112.112.112 & port: 22222
AND use FILE -> New Window and open RTP sesssion with port 22224.
OR
- use open URL and specify: rtp://224.112.112.112:22222/video
AND use FILE -> New Window and open URL with 22224/audio
Notes:
You should run 1. then 2., otherwise AVTransmit2 will find the port number used.
You can also use the program to send only audio or video as follows:
- java AVTransmit2 javasound://0 224.112.112.112 22222 (audio only)
- java AVTransmit2 vfw://0 224.112.112.112 22222 (video only)
In such case create only one instance of JMStudio.
Use Unicast:
- java AVTransmit2 file:clip01.mpg 128.82.4.7 22222
Where 128.82.4.7 is the receicver address.
If the sender address is 128.82.4.9 it will use port 22222 as well
to send out data. In this case the receiver (e.g., JMStudio)
should specify the sender as: 128.82.4.9 22222.
Therefore to use unicast you should have two machines since
you can not use the same port for both sender and receiver.
Receiving Audio and Video using RTP
AVReceive2 uses the RTPManager API to receive RTP transmissions.
AVReceive2 performs the following tasks:
Open one RTP session per session address given.
Listen for the NewReceiveStreamEvent from the ReceiveStreamListener.
Create a JMF Player for each stream received for playback.
This sample program can be used in conjunction with JMStudio,
the AVTransmit2 sample or any other RTP compliant transmitter.
The IP address should be the address of the computer which transmits the data; or the multicast address if multicast is being used for the transmission.
The ports should be the same as what's being used by the transmitter.
How to run this sample
1. Run AVTransmit2 with the required 3 command line parameters
For example:
- java AVTransmit2 file:clips/clip01mpg.mpg 224.112.112.112 1234
2. Run AVReceive2 and specify the RTP session addresses to receive from.
For example:
- java AVReceive2 224.112.112.112/1234 224.112.112.112/1236
to simultaneously receive 2 different RTP sessions (video and audio).
Note: because of port reuse, it must run in this order, 1 then 2.
㈤ 40、在Java中,如何實現組播通信
編輯一個java組播應用程序的過程如下
1. 創建一個用於發送和接收的MulticastSocket組播套接字對象
2. 創建一個指定緩沖區大小及組播地址和埠的DatagramPacket組播數據包對象
3. 使用組播套接字joinGroup(),將其加入到一個組播
4. 使用組播套接字的send()方法,將組播數據包對象放入其中,發送組播數據包.
或者
使用組播套接字的receive()方法,將組播數據包對象放入其中,接收組播數據包
5. 解碼組播數據包提取信息,並依據得到的信息作出響應String s = new String(dp.getData(), 0, dp.getLength());
6. 重復過程4和5,即在while循環中實現。
7. 使用組播套接字的leaveGroup()方法,離開組播組;關閉組播套接字
接收組播數據包程序:
Java代碼
public class MulticastReceived {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("224.0.0.4"); // 組播地址
int port = 4006; // 埠
MulticastSocket msr = null;
try {
msr = new MulticastSocket(port); // 1.創建一個用於發送和接收的MulticastSocket組播套接字對象
msr.joinGroup(group); // 3.使用組播套接字joinGroup(),將其加入到一個組播
byte[] buffer = new byte[8192];
System.out.println("接收數據包啟動!(啟動時間:)" + new java.util.Date() + ")");
while (true) {
DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 2.創建一個指定緩沖區大小及組播地址和埠的DatagramPacket組播數據包對象
msr.receive(dp); // 4.使用組播套接字的receive()方法,將組播數據包對象放入其中,接收組播數據包
String s = new String(dp.getData(), 0, dp.getLength()); // 5.解碼組播數據包提取信息,並依據得到的信息作出響應
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (msr != null) {
try {
msr.leaveGroup(group); // 7.使用組播套接字的leaveGroup()方法,離開組播組
msr.close(); // 關閉組播套接字
} catch (IOException e) {
}
}
}
}
}
發送組播數據包程序:
Java代碼
public class MulticastSender {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("224.0.0.1"); // 組播地址
int port = 4000; // 埠
MulticastSocket mss = null;
try {
mss = new MulticastSocket(port); // 1.創建一個用於發送和接收的MulticastSocket組播套接字對象
mss.joinGroup(group); // 3.使用組播套接字joinGroup(),將其加入到一個組播
byte[] buffer = new byte[8192];
System.out.println("接收數據包啟動!(啟動時間:)" + new java.util.Date() + ")");
while (true) {
String message = "Hello" + new java.util.Date();
byte[] buffer2 = message.getBytes(); // 2.創建一個指定緩沖區大小及組播地址和埠的DatagramPacket組播數據包對象
DatagramPacket dp = new DatagramPacket(buffer, buffer.length, group, port);
// msr.receive(dp); //接收組播數據包
mss.send(dp); // 4.使用組播套接字的send()方法,將組播數據包對象放入其中,發送組播數據包
// String s = new String(dp.getData(), 0, dp.getLength()); //5.解碼組播數據包提取信息,並依據得到的信息作出響應
System.out.println("發送數據包給" + group + ":" + port);
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (mss != null) {
try {
mss.leaveGroup(group); // 7.使用組播套接字的leaveGroup()方法,離開組播組
mss.close(); // 關閉組播套接字
} catch (IOException e) {
}
}
}
}
}
㈥ JAVA下如何實現語音通信的功能 新手求教 謝謝
我做過SIP的開發.sip是一種類似http的協議,比H323簡單多了.特別適合JAVA開發.
准備工具:java環境,開發工具eclipse等,測試工具ethereal必要的.
SIP:會話初始化協議(Session Initiation Protocol)
會話初始化協議(SIP)是一種應用層控制協議,它可用來創建、修改或終止多媒體會話,如網際網路電話呼叫。 SIP 能夠邀請參與者加入已存在的會話,如組播會議。現有的會話中可以添加或刪除媒體。 SIP 支持名稱映射和重定向服務,其支持用戶移動性。不管用戶網路位置在哪,用戶只需維持單一外部可視標識符。
SIP 在五個方面支持創建和終止多媒體通信:
用戶定位:決定用於通信的終端系統的確定;
用戶可用性:決定被叫方是否願意加入通信;
用戶能力:媒體和媒體參數的確定;
呼叫建立:「響鈴「,主叫方和被叫方的會話參數的建立;
呼叫管理:包括傳輸和終止會話、修改呼叫參數和調用服務。
SIP 可以結合其它 IETF 協議來建立完善的多媒體結構,如提供實時數據傳輸和服務質量(QOS)反饋的實時傳輸協議(RTP)、提供流媒體發送控制的實時流協議(RTSP)、為公用交換電話網路(PSTN)提供網關控制的媒體網關控制協議(MEGACO),以及描述多媒體會話的會話描述協議(SDP)。因此, SIP 需要與其它協議協同作用來為用戶提供完善的服務。然而 SIP 的基本功能和操作並不依賴於這些協議。
SIP 提供了一組安全服務,包括防止拒絕服務攻擊、認證(用戶對用戶和代理對用戶)、完整性保護和加密及隱私服務。
SIP 同時支持 IPv4 and IPv6 。關於網際網路電話會話, SIP 做如下工作:
通過 SIP 地址識別主叫方和被叫方。當建立一個 SIP 呼叫時,主叫方首先定位適合的伺服器,然後發出一個 SIP 請求。最通常的 SIP 行為是邀請。 SIP 請求會被代理重定向或者觸發一系列的新 SIP 請求,而不是直接到達目的被叫方。用戶可以通過 SIP 伺服器注冊他們的位置。 SIP 地址 (URL) 可以嵌入到網頁中,因此只要點擊一下就可以和對方建立呼叫會話。