【问题标题】:Websockets messages not being sentWebsockets 消息未发送
【发布时间】:2014-02-26 13:55:43
【问题描述】:

这是我正在编写的 Windows Media Player C# 代码,它将 TCP WebSocket 消息发送回客户端,说明 mp3 音频仍在播放。

我正在使用axWindowsMediaPlayer1.StatusChangeStatusChange 会相应地触发消息,但即使我可以在我的 WMP C# 应用程序中接收来自客户端的消息。

我不明白为什么它不会将var message_back = "Audio still Playing..."; 发送回客户端。

private void Form1_Load(object sender, EventArgs e)
{
    lblMessage.Text = "";
    axWindowsMediaPlayer1.URL = @"C:\Audio\song1.MP3";
    axWindowsMediaPlayer1.Ctlcontrols.stop();

    this.axWindowsMediaPlayer1.StatusChange += new EventHandler(axWindowsMediaPlayer1_StatusChange);

    this.axWindowsMediaPlayer1.StatusChange += new EventHandler(serverStartup);
}

public void axWindowsMediaPlayer1_StatusChange(object sender, EventArgs e)
{
    if (axWindowsMediaPlayer1.status == "Finished")
    {
        lblMessage.Text = "CONTINUE PLAYING...";
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
}

public void serverStartup(object sender, EventArgs e)
{
    FleckLog.Level = LogLevel.Debug;
    var allSockets = new List<IWebSocketConnection>();
    var server = new WebSocketServer("ws://localhost:8181");

    server.Start(socket =>
    {
        socket.OnOpen = () =>
        {
            allSockets.Add(socket);
        };

        socket.OnClose = () =>
        {                     
            allSockets.Remove(socket);
        };

        socket.OnMessage = message =>
        {
            allSockets.ToList().ForEach(s => s.Send("Echo: " + message));    
        };
    });

    if (axWindowsMediaPlayer1.status == "Finished")
    {
        var message_back = "Audio still Playing...";
        foreach (var socket in allSockets.ToList())
        {
            socket.Send(message_back);
        }

        // I tried using this line bellow, but it won't work either.
        //allSockets.ToList().ForEach(s => s.Send("Echo: " + message_back));
    }
}

【问题讨论】:

  • 我不明白:你的代码说 if(Finished)...send("still playing") ???
  • 当 axWindowsMediaPlayer1.status 检测到“完成”状态时,我需要向 Websocket 发送一条消息,在本例中该消息只是“音频仍在播放...”,但在最后代码将是别的东西,比如这个音频已经播放完毕......等等。
  • 好的 - 但是,你的 if(Finished) 在你的 serverStartup() 中,它应该在 axWindowsMediaPlayer1_StatusChange() 方法中吗?
  • axWindowsMediaPlayer1_StatusChange() 方法不必在 serverStartup() 函数中,但那是我需要一点帮助的地方,我不知道如何在没有它的情况下发送消息那个函数 serverStartup()
  • 我不明白为什么这被标记为'php' :-)

标签: c# .net websocket windows-media-player


【解决方案1】:

不过,我在这里猜测了很多,假设您的 axWindowsMediaPlayer1_StatusChange 正在被调用 - 在其中添加您的消息发件人:

// made this global for simplicity...
static List<IWebSocketConnection> allSockets;
allSockets = new List<IWebSocketConnection>();

public void axWindowsMediaPlayer1_StatusChange(object sender, EventArgs e)
{
    if (axWindowsMediaPlayer1.status == "Finished")
    {
        // send message...
        var message_back = "Starting again...";
        foreach (var socket in allSockets.ToList())
        {
            socket.Send(message_back);
        }

        // I assume this restarts playback...
        lblMessage.Text = "CONTINUE PLAYING...";
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }

}

【讨论】:

  • 我刚试过,但首先,变量 allSockets 抛出异常“找不到类型或命名空间名称 'var'(您是否缺少 using 指令或程序集引用?)”所以然后我在函数内移动了变量,但即使没有错误,它也不会发送消息“重新开始......”:(
  • 我的错误,var 是针对局部变量的,请参见上面的编辑
  • 现在静态变量显示:错误 4 'Application.Form1.allSockets' is a 'field' but is used like a 'type'
  • 我把代码改成:static List allSockets = new List();现在一切正常!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 2021-10-07
相关资源
最近更新 更多