gpt4 book ai didi

javascript - Javascript 和 Java 的 Web 套接字问题 - 未捕获的 DOMException : An attempt was made to use an object that is not, 或不再可用

转载 作者:行者123 更新时间:2023-12-05 09:07:45 24 4
gpt4 key购买 nike

我正在尝试在 js 和 java 之间建立网络套接字连接,但我得到了这个答案:
未捕获的 DOMException:尝试使用一个不可用或不再可用的对象
我是根据互联网上的一些样本做的。有人知道它会是什么吗?
项目名称为Teste-1


JS代码

var socket = null;
function init(){
socket = new WebSocket("wss://localhost:8080/Teste-1/task");
socket.onmessage = onMessage;

}

function onMessage(event){
var task = JSON.parse(event.data);
if(task.action === "add"){
document.getElementById("point").innerHTML += event.data;
}
}

function teste() {
var action = {
action: "add",
name: "Test",
description: "This is just a test"
};
socket.send(JSON.stringify(action));
}
window.onload = init;

HTML代码

<html>
<head>
<title>Test</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>

</head>
<body>
<button onclick="teste()">Teste</button>
<div id="point"></div>
<script src="websocket.js"></script>
</body>
</html>

Java 代码

public class Task implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String description;

public Task(){}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}
}
@ServerEndpoint(value="/task")
public class TaskSocket {
@Inject
private TaskSessionHandler handler;

@OnOpen
public void open(Session session){
handler.addSession(session);
}

@OnClose
public void close(Session session){
handler.removeSession(session);
}

@OnError
public void onError(Throwable error){
Logger.getLogger(TaskSocket.class.getName()).log(Level.SEVERE, null, error);
}

@OnMessage
public void handleMessage(String message, Session session) {
try (JsonReader reader = Json.createReader(new StringReader(message))) {
JsonObject jsonMessage = reader.readObject();

if ("add".equals(jsonMessage.getString("action"))) {
Task task = new Task();
task.setName(jsonMessage.getString("name"));
task.setDescription(jsonMessage.getString("description"));

handler.addTask(task);
}


}
}
}


@ApplicationScoped
public class TaskSessionHandler {
//Each client connected to the application has its own session.
private final Set<Session> sessions = new HashSet<>();
private final Set<Task> tasks = new HashSet<>();

public void addSession(Session session) {
sessions.add(session);
for(Task task : tasks){
JsonObject addMessage = createJSON(task);
sendToSession(session, addMessage);
}
}

public void removeSession(Session session) {
sessions.remove(session);
}

public List<Task> getTasks(){
List<Task> list = new ArrayList<Task>(tasks);
return list;
}

public void addTask(Task e){
tasks.add(e);
JsonObject message = this.createJSON(e);
sendToAllConnectedSessions(message);
}

private JsonObject createJSON(Task task){
JsonProvider provider = JsonProvider.provider();
JsonObject message = provider.createObjectBuilder()
.add("action", "add")
.add("name",task.getName())
.add("description",task.getDescription()).build();
return message;
}

private void sendToAllConnectedSessions(JsonObject message) {
for (Session session : sessions) {
sendToSession(session, message);
}
}

private void sendToSession(Session session, JsonObject message) {
try {
session.getBasicRemote().sendText(message.toString());
} catch (IOException ex) {
sessions.remove(session);
Logger.getLogger(TaskSessionHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}

}

最佳答案

由于在与 webSocket 服务器的连接建立和打开之前执行了 websocket.send(),我收到了相同的错误消息。

我的贡献是建议确保在连接打开之前不发送消息,以便服务器实际上可以接收它们。

不过,我无法判断这是否是所提问题中的问题。然而,我遇到了一个非常相似的问题并最终来到这里,并想分享对我有用的东西。

在我的例子中,不起作用的代码如下所示:

const exampleSocket = new WebSocket('wws://example')

exampleSocket.onopen = function (event) {
console.log('connection is open!')
}

exampleSocket.send(JSON.stringify(msg))

exampleSocket.onmessage = function (event) {
console.log('message event data looks like this: ', event.data)
}

起作用的是将发送消息的代码移到 onopen 回调函数中。

const exampleSocket = new WebSocket('wws://example')

exampleSocket.onopen = function (event) {
console.log('connection is open!')
exampleSocket.send(JSON.stringify(msg)) // <- this is the change
}

exampleSocket.onmessage = function (event) {
console.log('message event data looks like this: ', event.data)
}

旁注:websocket 的 readyState 属性在处理确保服务器准备好接收消息时可能很有用。

如果为1,表示连接打开,可以这样使用:

if (exampleSocket.readyState  === 1) {
console.log("It is safe to send messages now")
}

关于javascript - Javascript 和 Java 的 Web 套接字问题 - 未捕获的 DOMException : An attempt was made to use an object that is not, 或不再可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64488266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com