简体   繁体   English

使用 ws 通过 websocket 发送对象:无法反序列化

[英]Sending objects through websocket using ws: Can't deserialize

So I tried sending an object through my websocket by translating it to json and then back when it returns.所以我尝试通过我的 websocket 发送一个对象,将它转换为 json,然后在它返回时返回。 Unfortunately it gives me the below error.不幸的是,它给了我以下错误。 The console.log shows me that it is valid JSON, but somehow it gives me an error at JSON.parse in the service document. console.log 向我显示它是有效的 JSON,但不知何故它在服务文档中的 JSON.parse 处给了我一个错误。 Can anyone see what I did wrong?谁能看到我做错了什么?

The error错误

core.js?223c:1440 ERROR SyntaxError: Unexpected token c in JSON at position 0
    at JSON.parse (<anonymous>)
    at WebSocket._this.ws.onmessage [as __zone_symbol__ON_PROPERTYmessage] (movie-chat.service.ts?6086:22)
    at WebSocket.wrapFn (zone.js?fad3:1166)

console.log result of event.data (valid json) event.data 的 console.log 结果(有效的 json)

{"message":"good boy","extra":"extra"}

movie-chat.service.ts电影聊天服务.ts

import {Injectable} from "@angular/core";
import 'rxjs/rx';
import {HttpClient} from "@angular/common/http";
import {Observable} from "rxjs/Observable";

// We need @injectable if we want to use http
@Injectable()

export class MovieChatService {
ws;

constructor(private http: HttpClient) {
}

// receive events
createObservableSocket(url:string){
    this.ws = new WebSocket(url);
    return new Observable(observer => {
        this.ws.onmessage = (e) => {
            console.log(e.data);
            var object = JSON.parse(e.data);
            observer.next(object);
        }
        this.ws.onerror = (event) => observer.error(event);
        this.ws.onclose = (event) => observer.complete();
    }
    );
}
// send events
sendMessage(message) { 
    message = JSON.stringify(message);
    console.log(message);
    this.ws.send(message); 
}

}

Back-end handling of messages消息的后端处理

var wss = new Websocket.Server({port:3185});
var CLIENTS = [];

wss.on('connection',
    function(websocket) {

        CLIENTS.push(websocket);
        websocket.send('connected to socket');


        websocket.on('message', function (message) {
            console.log('Server received:', message);
            sendAll(message)
        });

        websocket.on('close', function(client) {
            CLIENTS.splice(CLIENTS.indexOf(client), 1);
        });

        websocket.on('error', function(client) {
            CLIENTS.splice(CLIENTS.indexOf(client), 1);
        });
});

movie-chat.component.ts电影聊天.component.ts

import {Component, OnInit} from "@angular/core";
import { MovieChatService} from "./movie-chat.service";

@Component({
    selector: 'app-movie-chat',
    templateUrl: './movie-chat.component.html',
    styleUrls: ['./movie-chat.component.css']
})

export class MovieChatComponent implements OnInit{

    fullName;
    messageFromServer;
    title = 'Websocket Demo';
    url;
    ws;
    messages = [];

    constructor(private movieChatService: MovieChatService){
    }

    ngOnInit(){
        this.fullName = localStorage.getItem('fullName');
        this.url = 'ws://localhost:3185';
        this.movieChatService.createObservableSocket(this.url)
            .subscribe(data => {
                    this.messageFromServer = data;
                },
                err => console.log(err),
                () => console.log('The observable stream, is complete'));
    }

    sendMessageToServer(){
        console.log('Client sending message to websocket server');
        this.movieChatService.sendMessage({
            message: 'good boy',
            extra: 'extra'
        });
    }
}

It seems that you are trying to parse a Json Object,看来您正在尝试解析 Json 对象,

{"message":"good boy","extra":"extra"}

JSON.parse expect string parameter and you are passing an Json Object for that the exception is rised. JSON.parse 期望字符串参数,并且您正在传递一个 Json 对象,以便引发异常。 We try to surround the Parse with try and catch我们尝试用 try 和 catch 包围 Parse

import {Injectable} from "@angular/core";
import 'rxjs/rx';
import {HttpClient} from "@angular/common/http";
import {Observable} from "rxjs/Observable";

// We need @injectable if we want to use http
@Injectable()

export class MovieChatService {
ws;

constructor(private http: HttpClient) {
}

// receive events
createObservableSocket(url:string){
    this.ws = new WebSocket(url);
    return new Observable(observer => {
        this.ws.onmessage = (e) => {
            console.log(e.data);
            try {
                var object = JSON.parse(e.data);
                observer.next(object);
            } catch (e) {
                 console.log("Cannot parse data : " + e);
            }
        }
        this.ws.onerror = (event) => observer.error(event);
        this.ws.onclose = (event) => observer.complete();
    }
    );
}
// send events
sendMessage(message) { 
    message = JSON.stringify(message);
    console.log(message);
    this.ws.send(message); 
}

}

So, I didn't actually solve it the way I wanted it, but I found out that it is possible to send arrays through a websocket.所以,我实际上并没有按照我想要的方式解决它,但我发现可以通过 websocket 发送数组。 I did this and on the receiving end I transferred it into an object in the service file.我这样做了,在接收端我将它传输到服务文件中的一个对象中。 It does the job for now.它现在可以完成工作。 If anyone knows a better solution, let me know :)如果有人知道更好的解决方案,请告诉我:)

createObservableSocket(url:string){
        this.ws = new WebSocket(url);
        return new Observable(observer => {
            this.ws.onmessage = (e) => {
                var obj = e.data.split(',');
                console.log(obj);
                obj = {
                    name: obj[0],
                    msg: obj[1]
                };
                console.log(obj);
                observer.next(obj);
            }
            this.ws.onerror = (event) => observer.error(event);
            this.ws.onclose = (event) => observer.complete();
        }
        );
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM