【问题标题】:How to use socket.io-client in angular 4如何在 Angular 4 中使用 socket.io-client
【发布时间】:2018-04-20 01:41:52
【问题描述】:

服务器端是 php laravel echo websocket,我正在尝试通过 Angular 4 连接。我尝试使用 ng2-socket-io - npm 和 laravel-echo - npm,但没有一个成功。如果有人知道我如何使用它的任何文档或教程,请帮助

【问题讨论】:

    标签: javascript angular typescript socket.io laravel-echo


    【解决方案1】:

    嗨@giga 工作示例如下。

    设置

    npm i socket.io-client --save
    npm i @types/socket.io-client --save
    

    服务器端 (nodejs)

    var express = require('express');
    var path = require('path');
    var app = express();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    
    var port = 8000;
    
    app.use(express.static(path.join(__dirname, "public")));
    
    io.on('connection', (socket) => {
    console.log('new connection made');
    
    socket.on('event1', (data) => {
      console.log(data.msg);
    });
    
    socket.emit('event2', {
      msg: 'Server to client, do you read me? Over.'
    });
    
    socket.on('event3', (data) => {
      console.log(data.msg);
      socket.emit('event4', {
        msg: 'Loud and clear :)'
      });
    });
    });
    
    server.listen(port, () => {
      console.log("Listening on port " + port);
    });
    

    客户端 - Angular4 代码

    import { Component, OnInit } from '@angular/core';
    import * as io from 'socket.io-client';
    
    @Component({
        moduleId: module.id,
        selector: 'ch-home',
        styleUrls: ['home.styles.css'],
        templateUrl: 'home.template.html'
    })
    
    export class HomeComponent implements OnInit {
        messageText: string;
        messages: Array<any>;
        socket: SocketIOClient.Socket;
    
      constructor() {
       // this.socket = io.connect('http://localhost:8000');
       this.socket = io.connect();
      }
    
      ngOnInit() {
            this.messages = new Array();
    
            this.socket.on('message-received', (msg: any) => {
                this.messages.push(msg);
                console.log(msg);
                console.log(this.messages);
            });
          this.socket.emit('event1', {
              msg: 'Client to server, can you hear me server?'
          });
          this.socket.on('event2', (data: any) => {
            console.log(data.msg);
            this.socket.emit('event3', {
                msg: 'Yes, its working for me!!'
            });
          });
          this.socket.on('event4', (data: any) => {
              console.log(data.msg);
          });
       }
    
       sendMessage() {
        const message = {
          text: this.messageText
        };
        this.socket.emit('send-message', message);
        // console.log(message.text);
        this.messageText = '';
      }
    
    }
    

    【讨论】:

    • 谢谢你的帮助
    • stackoverflow.com/questions/52702054/…你能帮忙解答这个问题吗
    • @GigaSongulashvili 嘿,你是如何将它与 laravel 连接起来的?
    • @VithuBati,event1,event2,event3,event4 是什么?它们是函数名称吗?就像您创建的具有 http 请求的函数(或方法)一样?
    • 我喜欢这个,但我在更新我的聊天模板时遇到问题,事件上的 socket-io 没有正确更新我的模板
    【解决方案2】:

    将 socket.io-client 实现为 Angular 服务

    设置

    npm install socket.io-client --save

    注意 2021: 不要安装 @types/socket.io-client,因为这些类型现在包含在 socket.io-client (v3) 包中,因此可能会导致问题 (source )。

    服务:

    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs';
    import { io, Socket } from 'socket.io-client';
    
    @Injectable()
    export class ChatService {
      private socket: Socket;
    
      constructor() {
        this.socket = io('http://localhost:3000');
      }
    
      // EMITTER example
      sendMessage(msg: string) {
        this.socket.emit('sendMessage', { message: msg });
      }
    
      // HANDLER example
      onNewMessage() {
        return new Observable(observer => {
          this.socket.on('newMessage', msg => {
            observer.next(msg);
          });
        });
      }
    }
    

    在组件中:

    import { Component, OnInit } from '@angular/core';
    import { ChatService } from './chat-service';
    
    @Component({
      // ...blabla...
    })
    export class ChatComponent implements OnInit {
      msgInput: string = 'lorem ipsum';
    
      constructor(
        private chatService: ChatService,
      ) { }
    
      ngOnInit() {
        this.chatService.onNewMessage().subscribe(msg => {
          console.log('got a msg: ' + msg);
        });
      }
    
      sendButtonClick() {
        this.chatService.sendMessage(this.msgInput);
      }
    }
    

    【讨论】:

    • sendMessage(msg: string) { this.socket.emit('sendMessage', { message: msg }); } 我怎样才能在这里发送确认?
    • 这是 socket-io 的正确实现,因为第一个在更新组件模板中的数据时效果不佳
    • 你好,在这里我发现有人已经实现了socket.io,请检查我的代码并告诉我是什么问题? stackoverflow.com/questions/56963376/…
    【解决方案3】:

    按照@MA-Maddin 的解决方案,我做了这个实现:

    服务端:socket.service

    import { Injectable } from '@angular/core';
    import * as io from 'socket.io-client';
    import {Observable} from 'rxjs';
    @Injectable({
    providedIn: 'root'
    })
    export class SocketService {
    private socket:SocketIOClient.Socket;
    
    constructor() { 
      this.socket=io('http://localhost:3300');
    }
    emit(event:string, data:any){
      this.socket.emit(event,data);
    }
    on(event:string){
      return Observable.create(observer=>{
       this.socket.on(event,data=>{
        observer.next(data);
       });
      })
     }
    }
    

    在组件处

     import { Component, OnInit, Input, ViewChild, ViewEncapsulation} from 
    '@angular/core';
    import { AuthService } from 'src/app/auth/auth.service';
    import Socket from '../../services/socket.service';
    
    @Component({
      selector: 'app-lobby-chat',
      templateUrl: './lobby-chat.component.html',
      styleUrls: ['./lobby-chat.component.css'],
      encapsulation: ViewEncapsulation.None,
    })
    export class LobbyChatComponent implements OnInit {
      constructor(private socket:Socket) {
      this.socket.on('getMessage').subscribe(data=>{
      console.log(data);
      });
      }
      pushMessage(msg){
      this.socket.emit('sendMessage',msg);
      }
    }
    

    这将正确更新您的绑定。 注意:**使用 npm i "@types/socket.io-client 来使用或定义 Socket io Types **

    【讨论】:

    • 你好,在这里我发现有人已经实现了socket.io,请检查我的代码并告诉我是什么问题? stackoverflow.com/questions/56963376/…
    • 仅供参考:Observer.create() 已弃用。
    • private socket:SocketIOClient.Socket; 这一行给出错误?任何解决方案
    • estas haciendo algo que no entiendo, private socket:SocketIOClient.Socket; de donde estas trayendo el SocketIOClient ??????????
    • @Enzo instala los types de socket con el comando "npm i @types/socket.io-client"
    【解决方案4】:

    除了你需要安装的 VithuBati 的答案: npm i socket.io-client --save npm i @types/socket.io-client --save

    【讨论】:

    • 所以我也必须运行第二个 cmd?在我的项目中找不到“SocketIOClient.Socket”命名空间...
    • 是的。第二个是必需的。
    • 你好,在这里我发现有人已经实现了socket.io,请检查我的代码并告诉我是什么问题? stackoverflow.com/questions/56963376/…
    【解决方案5】:

    我知道这是一个老问题,对我来说没有一个解决方案有效,所以我用下面的方法解决了。

    不要浪费时间如果您的套接字连接轮询工作正常并且没有出现任何错误,这可能是由于 socket.io.client 包与您的其他设置冲突

    我的应用程序版本如下。

    Angular 12.xSocket.io.client 4.xNode 14.16.1 我也尝试过使用 ngx-socket-io 包,但也没有用。奇怪的部分是 socket.io 轮询效果很好握手是正确的,但无法在新消息上监听事件。

    所以我的最终方法是将 socket.io 手动添加到 index.html 的角度和调度和事件到组件。

    function RsCustomEvent ( event, message ) {
        params = { bubbles: false, cancelable: false, detail: message };
        var evt = document.createEvent( 'CustomEvent' );
        evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
        return evt;
    }
    var socket = io('localhost:3000');
    socket.on("channel-name", function (message) {
        window.dispatchEvent(RsCustomEvent('socketEventListen',message));
    
    });
    

    然后在我使用下面代码的角度组件中。

     import { Observable , fromEvent} from 'rxjs';
    
    
    fromEvent(window, 'socketEventListen').subscribe((data) =>{
     });
    

    手动下载socket.io客户端js文件,放入asset文件夹,使用上述代码。

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 2020-05-23
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2016-01-06
      • 2018-08-21
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多