Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用WebSocket实现WebRTC信令_Java_Javascript_Jakarta Ee_Websocket_Webrtc - Fatal编程技术网

Java 使用WebSocket实现WebRTC信令

Java 使用WebSocket实现WebRTC信令,java,javascript,jakarta-ee,websocket,webrtc,Java,Javascript,Jakarta Ee,Websocket,Webrtc,为了使用WebRTC API连接对等通信,您需要实现信令。信令需要双向通信信道才能工作WebSockets是一种双向通信通道。我想使用WebSockets来实现信令,但是,我不知道如何实现这一点。我在网上找到的所有东西都只是讨论你可以使用的不同的双向渠道,而不是提供一个如何使用它们的例子 我在客户端使用JavaScript,在服务器端使用Java。那么,我将如何使用WebSockets实现信令呢?我找到了一种方法。我还没有测试代码,所以我不确定它是否有效。此外,我怀疑这是否有效。如果您有更好的解

为了使用
WebRTC API
连接对等通信,您需要实现信令。信令需要双向通信信道才能工作
WebSockets
是一种双向通信通道。我想使用
WebSockets
来实现信令,但是,我不知道如何实现这一点。我在网上找到的所有东西都只是讨论你可以使用的不同的双向渠道,而不是提供一个如何使用它们的例子


我在客户端使用
JavaScript
,在服务器端使用
Java
。那么,我将如何使用
WebSockets
实现信令呢?

我找到了一种方法。我还没有测试代码,所以我不确定它是否有效。此外,我怀疑这是否有效。如果您有更好的解决方案,请查看我的代码中的问题,或者任何建议,请随意详细说明。这背后的想法是让WebSocket服务器端点过滤消息并将其发送给适当的用户

  • 首先,我使用预先确定的用户id向客户端发送消息。WebSocket服务器端点只知道包含会话id的会话对象(不能更改;没有设置方法)。为了链接会话id和用户id,我需要一个数据库表(比将其保存在内存中可靠得多)

  • 然后,从客户端发送到WebSocket服务器端点的第一条消息将包含该用户的id。该id将与会话id一起映射到数据库,客户端将被视为“已连接”。当然,这是在实际连接到WebSocket之后发生的

  • 现在,一旦“连接”,我们可以向另一个用户发送(信号)消息,只要我们知道他们的用户id(我想我们知道)。WebSocket服务器端点根据数据库检查收件人用户id以查找其会话id。一旦找到,即可发送消息

  • 最后,在客户端,我们可以破译消息并发送相应的消息(使用上面相同的过程)

因此,如前所述,我们将需要一个用于客户端会话和用户id的数据库表。由于所有后端代码都使用Java,因此我们将通过创建一个实体类来保存属性,从而使用ORM(对象关系映射)。大概是这样的:

    @Entity
    public class WebSocketUser {
        @Id@GeneratedValue
        private long id;
        private long userId;
        private long sessionId;

        //constructors, getters and setters
    }
现在,我们可以创建服务器端点类:

    @ServerEndpoint("/SignalingServerEndpoint")
    public class SignalingServerEndpoint {
        //these class variables will be useful for 
        //access to the database and such
        private EntityManagerFactory emf;
        private EntityManager em;
        private EntityTransaction tx;
        private TypedQuery<WebsocketUser> query;
        private WebsocketUser wsu;
接下来,在WebSocket服务器端点的onMessage方法中,我们过滤消息。我选择以JSON格式发送消息。这使您能够轻松地破译信息(我使用了org.json库)。onMessage方法:

    @OnMessage
    public void message(Session session, String msg){
        try {
            JSONObject obj = new JSONObject(msg);
            if (!obj.has("toUserId")){
                //adding user to the database, so they can access their session ID with their user ID
                WebsocketUser wsu = new WebsocketUser(obj.getLong("userId"), session.getId());
                tx.begin();
                em.persist(wsu);
                tx.commit();
            }else if (obj.has("toUserId")){
                //message to be sent to the user with the specified user ID
                //get session ID from database
                query = em.createQuery("SELECT u FROM WebsocketUser u WHERE u.userId = " + obj.getLong("toUserId"), WebsocketUser.class);
                wsu = (WebsocketUser) query.getSingleResult();
                Set<Session> sessions = session.getOpenSessions();
                for (Iterator<Session> i = sessions.iterator(); i.hasNext();){
                    Session s = i.next();
                    if (s.getId().equals(wsu.getSessionId())){
                        s.getAsyncRemote().sendText(obj.getString("message"));
                        break;
                    }
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
现在,对于将消息发送到“连接”到WebSocket服务器端点的方法:

    function connect(){
        var msg = {
            "userId": userId
        };
        signalingSocket.send(JSON.stringify(msg));

最后,我们只有客户端的onMessage方法(它将破译消息并可能向另一个客户端发送信息)和所有实际的信令代码(ICE服务器、约束等)。我不会去做所有的信号工作,但有一个很好的教程,我希望这能帮助其他面临类似问题的人。正如我所说,我还没有测试代码,所以我不确定它是否能工作。此外,我非常怀疑这是否有效。但这至少是一个开始

使用Java中的websocketserver实现在两个JavaScript客户端之间转发通信。很抱歉,问题是关于使用Websocket传输从WEBRTC获取的媒体数据(视图和音频)。你如何解决这个问题?您不能使用JSON将复杂的视频和音频数据发送到websocket。您需要首先交换信息以建立对等连接。一旦建立连接,视频和音频数据将使用WebRTC API发送。请在您的回答中分享如何将WebRTC
转换为数据,然后将其发送到Websocket?您不通过Websocket连接发送流数据。查看WebRTC API
    var signalingSocket = new WebSocket("/SignalingServerEndpoint"); //TODO need the full and correct path to the WebSocket
    function connect(){
        var msg = {
            "userId": userId
        };
        signalingSocket.send(JSON.stringify(msg));