WebChart网页局域网聊天系列(一):ActiveX插件编写

第一步:创建ActiveX控件类库,在解决方案中右击添加Window窗体控件库

在该类库属性中,设置 使程序集COM可见,同时设置为COM互操作注册

另外在自动生成的文件中AssemblyInfo.cs,添加[assembly: AllowPartiallyTrustedCallers()]

以上操作的目的是,让其他框架页可以访问该ActiveX里的方法

第二步:添加前台接口类,主要给web页面调用

    [Guid("806635E5-AFF1-4BBE-960F-121910EB7F7A"),InterfaceType(ComInterfaceType.InterfaceIsDual),ComVisible(true)]
    public interface ISendMsg
    {
        [DispId(1)]
        int Conn(string ip,int port);
        [DispId(2)]
        void Send(string msg);
    }

 添加了这个方法,网页页面就可以访问这两个方法了

第三步:添加ActiveX触发接口,用于触发传递到Web页面的事件

    [Guid("D6F88421-BE17-4310-9692-A07A00CDF474"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch),ComVisible(true)]
    public interface IMsgEvent
    {
        [DispId(21)]
        void OnMsgHander(string msg);
    }

 第四步:在ActiveX类库中,实现前台接口类的实现方法

[Guid("8366F83A-F207-4B41-ACD1-49A3EBAFE192"), ProgId("Socket_Ocx.UserMain"), ClassInterface(ClassInterfaceType.None), ComDefaultInterface(typeof(ISendMsg)),ComSourceInterfaces(typeof(IMsgEvent)), ComVisible(true)]
    public partial class UserMain : UserControl, ISendMsg
    {
        private Socket client;
        public delegate void MsgHander(string msg);
        public event MsgHander OnMsgHander;

        public UserMain()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 连接到WEB通信服务器,同时开启接收消息线程
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public int Conn(string ip, int port)
        {
            int result = 0;
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip),port);
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                client.Connect(iep);
                result = 1;
                Thread nowThread = new Thread(new ThreadStart(ReciveData));
                nowThread.Start();
            }
            catch
            {
                result = 0;
            }
            return result;
        }

        //发送消息给WEB服务器
        public void Send(string msg)
        {
            try
            {
                byte[] data = Encoding.UTF8.GetBytes(msg);
                client.Send(data);
            }
            catch (Exception ex)
            {

            }
        }

        /// <summary>
        /// 接收WEB服务器发来的消息
        /// </summary>
        private void ReciveData()
        {
            int res;
            while (true)
            {
                try
                {
                    byte[] bytes = new byte[1024];
                    res = client.Receive(bytes);
                    string msg = Encoding.UTF8.GetString(bytes, 0, res);
                    OnMsgHander(msg);
                }
                catch (Exception ex)
                {

                }
            }
        }
    }

 第五步:Web页面连接及接收发送数据

<object id="ocx" classid="clsid:8366F83A-F207-4B41-ACD1-49A3EBAFE192">
</object>

 前台脚本编写,代码如下:

	<script for="ocx" language="JavaScript" event="OnMsgHander(s)">
		if(document.getElementById("txtAllMsg").value == ""){
			document.getElementById("txtAllMsg").value = s;
		}
		else{
			document.getElementById("txtAllMsg").value += "
"+ s;
		}
   </script>
   <script type="text/javascript">
		function onLogin(){
			var user = document.getElementById("txtUserName").value;
			var pswd = document.getElementById("txtPswd").value;
			if(user==""||pswd==""){
				alert("请输入用户名及密码!");
				return;
			}
			document.getElementById("divMax").style.display="none";
			document.getElementById("txtUser").value = user;
			document.getElementById("spanUser").innerHTML = user;
			init();
		}
		
		function init(){
			var res = ocx.Conn('127.0.0.1',2000);
		}
		
		function onSend(){
			var msg = document.getElementById("txtSendMsg").value;
			if(msg==""){
				alert("您的发送内容为空!");
				return;
			}
			var user = document.getElementById("txtUser").value;
			ocx.Send(user+":"+msg);
			if(document.getElementById("txtAllMsg").value == ""){
				document.getElementById("txtAllMsg").value = user+":"+msg;
			}
			else{
				document.getElementById("txtAllMsg").value += "
"+ user+":"+msg;
			}
			document.getElementById("txtSendMsg").value ="";
		}
	</script>

 以上展示的是客户端基本结构及主要代码,下一篇主要接收服务器端主要结构及代码

源代码:WebChart.rar

原文地址:https://www.cnblogs.com/kinger906/p/3426831.html