我正在尝试在C#中创建一个简单的WebSocket服务器,它将在JavaScript中与客户端通信,我正在测试的代码是:
Websocket-sharp服务器
using System;
using System.Windows.Forms;
using WebSocketSharp;
using WebSocketSharp.Server;
namespace MyProgram
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var wssv = new WebSocketServer(8081);
wssv.WaitTime = TimeSpan.FromSeconds(3);
wssv.AddWebSocketService<NFP>("/");
wssv.Start();
}
}
public class NFP : WebSocketBehavior
{
protected override void OnMessage(MessageEventArgs e)
{
Console.WriteLine(e.Data);
Send("Received");
}
protected override void OnError(ErrorEventArgs e)
{
//Console.WriteLine(e.Exception);
}
protected override void OnClose(CloseEventArgs e)
{
//Console.WriteLine(e.Code);
}
}
}
现在我想知道,如何在FormM1上已经打开的ListBox上发送OnMessage收到的消息?
答案 0 :(得分:1)
将目标列表框定义为NPF类的属性:
public ListBox Target {get; set;}
在button1_Click方法中设置目标:
wssv.Target = myListBox;
收到邮件后,将其添加到列表框中。但是,由于您位于与UI线程不同的线程(这是唯一可以修改表单上的控件的线程),您必须调用Invoke
上的Target
成员来完成您的工作:
protected override void OnMessage(MessageEventArgs e)
{
Console.WriteLine(e.Data);
if (Target != null)
Target.Invoke( () => {Target.Items.Add(e.Message);});
Send("Received");
}
答案 1 :(得分:0)
更好的解决方案是在c#中使用Binding。
但如果您想要快速解决方案,可以创建此类:
public static class ListBoxAdder
{
public static void Add(ListBox listbox, string newItem)
{
listbox.Items.Add(newItem);
}
}
Form1中的声明
public static ListBox listBox;
最后
protected override void OnMessage(MessageEventArgs e)
{
ListBoxAdder.Add(Form1.listBox, e.Data);
}