- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我会尽量简短。
我希望在两个java应用程序之间创建通信(稍后将传输到android)而不通过服务器。因此,我花了几周时间四处寻找,经过大量工作后我发现了 stun 和ice4j。我找到的关于如何使用ice4j的最好解释here ,它几乎向我展示了如何通过以下代码将 stun 服务器添加到代理(我真的不知道代理是什么,只是它管理我与 STUN 和 TURN 的通信):
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.ice4j.Transport;
import org.ice4j.TransportAddress;
import org.ice4j.ice.Agent;
import org.ice4j.ice.IceMediaStream;
import org.ice4j.ice.harvest.StunCandidateHarvester;
public class ice4jTesting {
public static void main(String[] args) {
Agent agent = new Agent();
String[] hostnames = new String[] {"jitsi.org", "numb.viagenie.ca", "stun.ekiga.net"};
for(String hostname: hostnames) {
try {
TransportAddress address;
address = new TransportAddress(InetAddress.getByName(hostname), 3478, Transport.UDP);
agent.addCandidateHarvester(new StunCandidateHarvester(address));
} catch (UnknownHostException ex) {
Logger.getLogger(SimpleStun.class.getName()).log(Level.SEVERE, null, ex);
}
}
IceMediaStream stream = agent.createMediaStream("audio");
int port = 5000;
try {
agent.createComponent(stream, Transport.UDP, port, port, port+100);
// The three last arguments are: preferredPort, minPort, maxPort
} catch (IllegalArgumentException | IOException ex) {
Logger.getLogger(SimpleStun.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
但是,在此之后,本教程将使用 SDPUtils
,这是我在github 上找到的ice4j 源代码中的一个类。 ,从代理接收SDP信息。但是我从 the central maven repository 得到了ice4j.jar ,并将其添加到我的 netbeans 常规项目中(我这样做是因为我对 Maven 不太熟悉,只是想要在我的常规项目上有一个常规库)。这个 jar 库没有 SDPUtils
类,并且由于我对这段代码的理解不够,无法自己修复它,我想知道你们中的任何人是否可以帮助我修复上面的代码,或者向我展示如何回答标题问题的示例。
但是,除非您可以按照我在上一句中所说的操作,或者向我指出一些示例代码,否则您的帮助很可能没有用,因为我在精神上无法完全理解其背后的理论,因为很多概念我不知道。
我必须在本周末之前弄清楚这一点,如果我不这样做,我就完蛋了。因此,如果您可以或认识可以提供帮助的人,我将非常感激。
感谢您到目前为止阅读并尝试提供帮助:)
最佳答案
就这样
SdpUtils.java
Actually i'm also working on the same as my University project. From last week i'm digging web for p2p connection establish over nat.
I know that form where you got above Code snipet, i would like to inform you that there is errors in that code Here is the one that i corrected
import java.io.IOException;
import java.net.BindException;
import java.net.InetAddress;
import org.ice4j.Transport;
import org.ice4j.TransportAddress;
import org.ice4j.ice.Agent;
import org.ice4j.ice.IceMediaStream;
import org.ice4j.ice.harvest.StunCandidateHarvester;
public class IceTest {
public static void main(String[] args) throws Exception {
Agent agent = new Agent(); // A simple ICE Agent
/*** Setup the STUN servers: ***/
String[] hostnames = new String[] { "jitsi.org", "numb.viagenie.ca", "stun.ekiga.net" };
// Look online for actively working public STUN Servers. You can find
// free servers.
// Now add these URLS as Stun Servers with standard 3478 port for STUN
// servrs.
for (String hostname : hostnames) {
try {
// InetAddress qualifies a url to an IP Address, if you have an
// error here, make sure the url is reachable and correct
TransportAddress ta = new TransportAddress(InetAddress.getByName(hostname), 3478, Transport.UDP);
// Currently Ice4J only supports UDP and will throw an Error
// otherwise
agent.addCandidateHarvester(new StunCandidateHarvester(ta));
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* Now you have your Agent setup. The agent will now be able to know its
* IP Address and Port once you attempt to connect. You do need to setup
* Streams on the Agent to open a flow of information on a specific
* port.
*/
IceMediaStream stream = agent.createMediaStream("audio");
int port = 5000; // Choose any port
try {
agent.createComponent(stream, Transport.UDP, port, port, port + 100);
// The three last arguments are: preferredPort, minPort, maxPort
} catch (BindException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
* Now we have our port and we have our stream to allow for information
* to flow. The issue is that once we have all the information we need
* each computer to get the remote computer's information. Of course how
* do you get that information if you can't connect? There might be a
* few ways, but the easiest with just ICE4J is to POST the information
* to your public sever and retrieve the information. I even use a
* simple PHP server I wrote to store and spit out information.
*/
String toSend = null;
try {
toSend = SdpUtils.createSDPDescription(agent);
// Each computersends this information
// This information describes all the possible IP addresses and
// ports
} catch (Throwable e) {
e.printStackTrace();
}
/*The String "toSend" should be sent to a server. You need to write a PHP, Java or any server.
* It should be able to have this String posted to a database.
* Each program checks to see if another program is requesting a call.
* If it is, they can both post this "toSend" information and then read eachother's "toSend" SDP string.
* After you get this information about the remote computer do the following for ice4j to build the connection:*/
String remoteReceived = ""; // This information was grabbed from the server, and shouldn't be empty.
SdpUtils.parseSDP(agent, remoteReceived); // This will add the remote information to the agent.
//Hopefully now your Agent is totally setup. Now we need to start the connections:
agent.addStateChangeListener(new StateListener()); // We will define this class soon
// You need to listen for state change so that once connected you can then use the socket.
agent.startConnectivityEstablishment(); // This will do all the work for you to connect
}
}
This code Requires SIP server to be setup and the one on ice4j test is saying something else just have a look at Ice.java
关于java - 如何使用Stun和ice4j接收公共(public)IP和端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36829060/
刚读 this article ,这让我很想知道加快谈判阶段的好处。我正在开发一个应用程序,其中我使用的是仅使用 ICE 的第三方实用程序,但最终将在下一个版本中升级为涓流 ICE。升级需要相当多的代
您好,我使用 Zeroc Ice 通信库 (v3.4.2) 编写了一个 C# 客户端/服务器应用程序。 我正在从服务器传输一系列对象,然后以表格格式在客户端中显示它们。很简单。 我定义了以下切片类型
未捕获的 DOMException:构建“RTCPeerConnection”失败:当 URL 方案为“turn”或“turns”时,需要用户名和凭据。 我收到这个错误是因为我使用的是 ice 服务器
我的本地计算机上的 WiX 遇到一些奇怪的问题。该问题是间歇性的,但在对解决方案进行几次重建后,WiX 项目开始抛出 ICE 验证错误。 如果我进入 AppData\Local\Temp 文件夹并
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 个月前。 Improve this q
我使用 WiX 3.5 构建了一个安装程序。安装程序使用 VB6 合并模块。我总是从与此类似的灯光中收到很多错误消息: error LGHT0204: ICE03: Table: Class Colu
我正在尝试使用 TFS 将 WiX 集成到我的自动构建解决方案中2010 运行于 Windows Server 2008 R2。一切似乎都很简单,然后我明白了: light.exe: Error ex
我正在遵循 Licode page 上的指南 我已经在 Ubuntu 14.04 上安装了所有内容。 我已经在 licode_config.js 中为 licode 和 erizo Controlle
我正在使用 WebRTC API 在运行在 chrome 浏览器上的两台 PC 之间进行视频通话。我的观察是只有当我连接到互联网时才会生成 ICE 候选者,否则不会生成 ICE 候选者。为什么会这样?
我的树表中有很多命令链接,我动态构建它们,如果我想在单击一个命令链接时更改它的颜色,所有命令链接都会更改它们的颜色,我不知道如何做更改此指定链接的颜色,因为我不知道她的号码或 ID,如果有人知道答案,
假设我有这样的功能(在 Javascript 中): 功能乐趣(success_cb,error_cb){ 变量结果; 尝试 { 结果 = function_that_calculates_resul
不要在 safari 中工作示例 https://github.com/Kurento/kurento-tutorial-node/tree/master/kurento-one2many-call
视频通话在同一网络内工作正常。问题是在其他网络上调用计算机时,远程视频不显示。在 chrome 上,我在控制台中没有收到任何错误,但在 firefox 控制台上,我收到了“ICE Failure”。
我遇到了 ZeroC ICE 字典语法的新手问题。这是我尝试过的方法,但似乎没有任何效果。 /*What I want to make >*/ dictionary> FlightSchedule;
此菜单不适用于任何 IE 版本。我怎样才能让它工作? 我也想添加过渡,有没有办法添加它以便从顶部缓慢打开? http://tinyurl.com/7rxskdj #nmenu {width:700px
我正在开发两个对等点之间的信号系统,并注意到 RTCPeerConnection.onicecandidate 事件没有触发。我检查了 iceGatheringState,它总是返回"new",这意味
我想利用 ICE Faces fileInput 控件根据用户选择的文件为网页上的输入字段输入文件路径和文件名。如何在不实际执行任何文件传输操作的情况下捕获这些属性? 最佳答案 我相信真正的答案是你不
我已经阅读了 RFC 5389 和 RFC 5245 以及更新的 RFC 8445。我了解 STUN 如何返回服务器反身地址或中继地址。请求被发送到 STUN 服务器。 我的基本问题是关于使用 STU
我正在开发一个 iOS 应用程序,使用 WebRTC 与 RTCDataChannel 进行点对点数据通信。当两个设备都在同一个 wifi 网络上时,我已经设法让一切正常工作,但是当我将 1 放在移动
我正在尝试建立 b/w 两个对等点的 p2p 音频/视频连接。以下:Getting started with WebRTC . 它在我家的两台 PC 之间的 LAN 环境中运行良好,但在运行时抛出错误
我是一名优秀的程序员,十分优秀!