简体   繁体   English

如何使用 socketio 广播消息

[英]How to broadcast a message using socketio

I am trying to broadcast a message using scketio.我正在尝试使用 scketio 广播消息。 Here is my JS File:这是我的 JS 文件:

document.addEventListener("DOMContentLoaded", () => {
  var socket = io.connect(
    location.protocol + "//" + document.domain + ":" + location.port
  ); 

socket.on("connect", () => {
    document.querySelector(".create-channel-div").onsubmit = () => {
      const contents = document.querySelector(".name").value;
      socket.emit("channel created", { contents: contents });

  return false;
};
socket.on("broadcasting channel", (someData) => {
  const a = document.createElement("a");
  a.innerHTML = `${someData.contents}`;
  a.setAttribute("href");
  document.querySelector(".stored-channels-div").append(p);
});

document.querySelector(".message-typed-div").onsubmit = () => {
  let today = new Date();
  let month = today.getMonth();
  let date = today.getDate();
  let hours = today.getHours();
  let minutes = today.getMinutes();

  const monthNames = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
  ];

  let current_time = `${monthNames[month]} ${date}, ${hours}:${minutes}`;

  const selection = document.querySelector(".message-entered").value;
  socket.emit("submit data", {
    username: username,
    selection: selection,
    time_stamp: current_time,
  });

  return false;
};
socket.on("announce data", (data) => {
  const p = document.createElement("p");
  p.innerHTML =
    `<span>${data.username}</span>` +
    `</br>``<span>${data.selection}</span>` +
    `</br>` +
    `<span>${data.time_stamp}</span>`;
  document.querySelector(".display-message").append(p);
  // username = `<span>${data.username}</span>` + `</br>` +
});
 });
});

Here is my Python file:这是我的 Python 文件:

import os

from flask import Flask, render_template, request, url_for, redirect, session
from flask_socketio import SocketIO, emit, join_room, leave_room
from time import localtime, strftime

app = Flask(__name__)
app.config["SECRET_KEY"] = "I0OeBc%W@6TdF#"
app.config["SESSION_TYPE"] = "filesystem"
app.config["SESSION_PERMANENT"] = False
socketio = SocketIO(app)

# localtime = strftime('%b-%d %I:%M%p', localtime())

@app.route("/", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        user = request.form.get('user')
    else:
        return render_template("login.html")

@app.route("/chatroom")
def chatroom():
    return render_template("chatting.html")

@socketio.on('submit data')
def sample(data):
    username = data["username"]
    selection = data["selection"]
    time_stamp = data["time_stamp"]
    # username = data["username"]
    emit("announce data", {"username":username,"selection":selection, "time_stamp":time_stamp}, broadcast = True)

@socketio.on('join')
def on_join(data):
    pass


@socketio.on('channel created')
def channel(someData):
    contents = someData["contents"]
    emit("broadcasting channel", {"contents":contents})


socketio.run(app)

When I entered a message(whose id is message-entered) everything works fine.当我输入一条消息(其 id 是消息输入)时,一切正常。 The message is getting displayed on multiple browsers.该消息正在多个浏览器上显示。 But when I have written the same code to create the channel, then that is not getting broadcasted in multiple browsers.但是,当我编写了相同的代码来创建频道时,就不会在多个浏览器中进行广播。 So is the code wrong?那么代码错了吗?

Try giving broadcast=True when you emit from your Python code.当您从 Python 代码发出时,请尝试给出broadcast=True

@socketio.on('channel created')
def channel(someData):
    contents = someData["contents"]
    emit("broadcasting channel", {"contents":contents}, broadcast=True)

Maybe this does your work.也许这对你有用。

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

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