【问题标题】:Websocket Javascript client onmessage won't fireWebsocket Javascript客户端onmessage不会触发
【发布时间】:2014-09-15 08:23:11
【问题描述】:

我正在尝试学习 websocket。我开始在同行之间发送简单的字符串,一切都很好。现在我正在尝试将 Object 发送到我的 客户端,但 onmessage 函数永远不会触发。代码如下:

Java 服务器端:

@ServerEndpoint(value = "/event/{id}",
    encoders={PositionJSONEncoder.class},
    decoders={PositionJSONDecoder.class}
)
public class SocketManager {

private static ConcurrentHashMap<String, Session> users = new ConcurrentHashMap<String, Session>();
@OnMessage
    public void onMessage(Position position, @PathParam("id") String id, Session session) {

        log.info("user "+id+", "+position.toString());
        try {
            for(Entry<String, Session> entry : users.entrySet()) {
                if(!entry.getKey().equals(position.getUserID()) && entry.getValue().isOpen()) {
                    entry.getValue().getBasicRemote().sendObject(position);
                }
            }
        } catch (EncodeException ee) {
            log.error(ee);
        } catch (IOException ioe) {
            log.error(ioe);
        }
    }
}

serverendpoint 编码器(我将省略解码器,服务器正确处理数据):

public class PositionJSONEncoder implements Encoder.Text<Position>{

    private Gson gson = new Gson();

    public void destroy() {}

    public void init(EndpointConfig arg0) {}

    public String encode(Position arg0) throws EncodeException {
        return gson.toJson(arg0);
    }
}

相关客户端(AngularJS):

app.factory('socket', function() {
        var service = {};
        service.ws = {};

        service.connect = function(userID) {
            this.ws = new WebSocket("ws://localhost:8080/event/"+userID);
        };
        service.disconnect = function() {
            if(this.ws != undefined && this.ws != null) {
                this.ws.onclose();
            }
        };
        service.ws.onopen = function() {
            // TODO
        };
        service.ws.onmessage = function(msg) {
            try {
                alert('roba: '+JSON.parse(msg.data));
            } catch(err) {
                alert(err.message);
            }
        };
        service.ws.onclose = function() {
        // TODO
        };
service.ws.onerror = function(evt) {
    alert(evt.data);
};
return service;
});

服务器发送的模型:

public class Position {

    private String userID;
    private Float lat;
    private Float lng;

    public Position() {}

    public String getUserID() {
        return userID;
    }
    public void setUserID(String userID) {
        this.userID = userID;
    }
    public Float getLat() {
        return lat;
    }
    public void setLat(Float lat) {
        this.lat = lat;
    }
    public Float getLng() {
        return lng;
    }
    public void setLng(Float lng) {
        this.lng = lng;
    }

    @Override
    public String toString() {
        return userID+"["+"lat: "+lat+", "+"lng: "+lng+"]";
    }
}

我的 pom 的依赖:

<dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <!-- GSON JSON serializer -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>1.7.1</version>
        </dependency>
</dependencies>

服务器正确地从客户端获取 JSON 对象,但是当它向客户端发送一些 Position 对象时,onmessage 函数不会触发。我可以看到编码器正在工作,因为它返回如下字符串:

{"userID":"bob","lat":2.0,"lng":2.0}

我看到 websocket 携带消息:

但我的 javascript onmessage 函数始终保持沉默。我还实现了一个onerror 函数,但我也无法从中获得任何反馈。我正在使用 wildfly-8.0.0.Final。

更新:我实现了一个 java websocket 客户端。该客户端接收服务器发送的 websocket 帧。我的 AngularJS 客户端错了吗?

【问题讨论】:

    标签: javascript javascript angularjs websocket java-ee-7


    【解决方案1】:

    我发现了问题所在。在我的 javascript 客户端中,我将一个函数分配给了一个未定义的对象。这里:

    service.ws.onmessage = function(msg) {
        try {
            alert('roba: '+JSON.parse(msg.data));
        } catch(err) {
            alert(err.message);
        }
    };
    

    service.ws.onmessage 未定义,这就是为什么onmessage 函数永远不会触发。我以这种方式更改我的角度工厂:

    app.factory('socket', function() {
        var service = {};
        service.ws = {};
    
        service.connect = function(userID) {
            this.ws = new WebSocket("ws://localhost:8080/event/"+userID);
            this.ws.onmessage = function(msg) {
                try {
                    alert('roba: '+JSON.parse(msg.data).lat+' :: '+JSON.parse(msg.data).lng);
                } catch(err) {
                    alert(err.message);
                }
            };
            this.ws.onerror = function(evt) {
                alert('error: '+evt.data);
            };
        };
        service.disconnect = function() {
            if(this.ws != undefined && this.ws != null) {
                this.ws.onclose();
            }
        };
        return service;
    });
    

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多