当前位置:编程学习 > C#/ASP.NET >>

求助啊,关于 即时通讯的

谁有,或做过  agsxmpp   和 ejabberd  做  即时通讯啊,最好有例子,急用啊 --------------------编程问答-------------------- 好牛 通讯我只听过socket.. --------------------编程问答-------------------- 我是  新手,刚毕业,来公司  就让我做这个,求救啊 --------------------编程问答--------------------
 #region 属性
        /// <summary>
        /// 网络发送超时时间
        /// </summary>
        public static string SendTimeout { set; get; }

        /// <summary>
        /// 网络接收超时时间
        /// </summary>
        public static string ReceiveTimeout { set; get; }       
        #endregion

        #region 变量
        private Encoding encoding = Encoding.GetEncoding("utf-8");
        const int socketLength = 2000;
        #endregion

        /// <summary>
        /// 释放链接
        /// </summary>
        public void Close()
        {
            if (TcpClient.Instance != null)
            {
                TcpClient.Instance.Actived = false;
                TcpClient.Instance.Client.Close();
                TcpClient.Instance.Close();             
            }
        }

        /// <summary>
        /// 是否连接
        /// </summary>
        /// <returns></returns>
        public bool isContect()
        {
            return TcpClient.Instance.Actived && TcpClient.Instance.Client.Connected;
        }

        ///<summary>
        ///向服务器发送的请求
        ///</summary>
        ///<param name="URL">请求的地址</param>
        ///<param name="postData">向服务器发送的文本数据</param>
        ///<returns>服务器响应文本</returns>
        public string OpenRead(string postData, int actionID)
        {           
                byte[] sendBytes = encoding.GetBytes(postData);               
                SendData(sendBytes, actionID);
                return GetData();            
        }

        /// <summary>
        /// 向服务器发送的请求(数据压缩)
        /// </summary>
        /// <param name="URL"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public string UploadCompress(string data, int actionID)
        {
            byte[] buffer = encoding.GetBytes(data);
            MemoryStream stream = GZipStream(buffer, buffer.Length);            
            //发送请求数据            
            SendBinary(new byte[0], stream.ToArray(), actionID);
            //返回响应文本
            return GetData();
        }     

        /// <summary>
        /// 上传文件到服务器
        /// </summary>       
        /// <param name="filePath">文件路径</param>
        /// <param name="actionID">文件路径</param>
        /// <returns>服务器响应文本</returns>
        public string UploadFile(int actionID,string json, string filePath)
        {            
            byte[] buffer;
            //添加文件数据
            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                buffer = new byte[fs.Length];
                fs.Read(buffer, 0, int.Parse(fs.Length.ToString()));  
            }           

            //发送二进制请求数据
            SendBinary(encoding.GetBytes(json), buffer, actionID);           
            //返回响应文本
            return GetData(); 
        }

        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="json">请求json体</param>
        /// <param name="actionID">请求类型</param>
        /// <param name="result">请求结果</param>
        /// <returns></returns>
        public byte[] DownLoadFile(string json, int actionID, out string result)
        {
            SendData(encoding.GetBytes(json), actionID);
            return GetBytes(out result);
        }


        /// <summary>
        /// 初始化Socket连接
        /// </summary>
        /// <param name="server"></param>
        public bool InitContection(string ip ,string port)
        {
            if (TcpClient.Instance.Actived)
            {
                Close();
            }
            try
            {
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), int.Parse(port));
                TcpClient.Instance.Init(endPoint, int.Parse(ReceiveTimeout), int.Parse(SendTimeout));
            }
            catch (Exception)
            {
                return false;
            }

            return isContect();

        }

        public void SetTimeOut(int multiple)
        {
            TcpClient.Instance.SetTimeout(multiple * int.Parse(ReceiveTimeout), multiple * int.Parse(SendTimeout));
        }
--------------------编程问答--------------------
#region 私有方法
        /// <summary>
        /// 获取服务器返回的字节数组
        /// </summary>
        /// <returns></returns>
        private byte[] GetBytes(out string result)
        {
            byte[] buffer;
            try
            {
                buffer = ReceiveBinary(out result);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            return buffer;
        }

        /// <summary>
        /// GZIP压缩流方式
        /// </summary>
        /// <param name="stream">输入流</param>
        /// <param name="BlockSize">压缩块大小</param>
        /// <returns></returns>
        private MemoryStream GZipStream(byte[] buffer, int BlockSize)
        {
            MemoryStream ms = new MemoryStream();
            GZipOutputStream ZipStream = new GZipOutputStream(ms);
            try
            {
                ZipStream.Write(buffer, 0, BlockSize);
            }
            finally
            {
                ZipStream.Finish();
            }
            return ms;
        }
        /// <summary>
        /// 向服务器发送二进制数据
        /// </summary>
        /// <param name="postStream"></param>
        /// <param name="actionID"></param>
        private void SendBinary(byte[] json, byte[] binary, int actionID)
        {
            try
            {

                if (TcpClient.Instance.Client != null && TcpClient.Instance.Client.Connected)
                {
                    //操作类型(Action)
                    byte[] action = new byte[4];
                    action = BitConverter.GetBytes(actionID);

                    //文本数据长度
                    byte[] jsonLength = new byte[4];
                    jsonLength = BitConverter.GetBytes(json.Length);

                    //二进制数据长度
                    byte[] binaryLength = new byte[4];
                    binaryLength = BitConverter.GetBytes(binary.Length);

                    TcpClient.Instance.Client.Send(CombineByte(action, jsonLength, binaryLength, json, binary));
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
        }

        /// <summary>
        /// 向服务器发送文本请求
        /// </summary>       
        /// <param name="buffer">要发送的数据</param>       
        /// <param name="actionID">操作类型</param>
        private void SendData(Byte[] json, int actionID)
        {
            try
            {
                if (TcpClient.Instance.Client != null && TcpClient.Instance.Client.Connected)
                {
                    //操作类型(Action)
                    byte[] action = new byte[4];
                    action = BitConverter.GetBytes(actionID);
                    //协议文本长度
                    byte[] jsonLength = new byte[4];
                    jsonLength = BitConverter.GetBytes(json.Length);
                    //二进制数据长度
                    byte[] binaryLength = new byte[4];
                    binaryLength = BitConverter.GetBytes(0);
                    TcpClient.Instance.Client.Send(CombineByte(action, jsonLength, binaryLength, json));
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
        }


        /// <summary>
        /// 获取服务器回发数据
        /// </summary>
        /// <returns></returns>
        private string Receive()
        {
            string result = string.Empty;

            //接收操作类型4字节
            byte[] actionID = new byte[4];
            TcpClient.Instance.Client.Receive(actionID, 0, 4, System.Net.Sockets.SocketFlags.None);
            int action = BitConverter.ToInt32(actionID, 0);

            //接收数据体长度4字节
            byte[] jsonLength = new byte[4];
            TcpClient.Instance.Client.Receive(jsonLength, 0, 4, System.Net.Sockets.SocketFlags.None);
            int jsonlength = BitConverter.ToInt32(jsonLength, 0);

            //接收二进制长度4字节
            byte[] binaryLength = new byte[4];
            TcpClient.Instance.Client.Receive(binaryLength, 0, 4, System.Net.Sockets.SocketFlags.None);
            //按长度接收数据体
            if (jsonlength > 0)
            {  
                using (MemoryStream ms = new MemoryStream())
                {
                    //int index = 0;
                    //while (index + socketLength < jsonlength)
                    //{
                    //    byte[] binary = new byte[socketLength];
                    //    int count = TcpClient.Instance.Client.Receive(binary, 0, socketLength, System.Net.Sockets.SocketFlags.None);
                    //    ms.Write(binary, 0, count);
                    //    index += count;
                    //}
                    //if (jsonlength - index > 0)
                    //{
                    //    byte[] binary = new byte[jsonlength - index];
                    //    int count = TcpClient.Instance.Client.Receive(binary, 0, jsonlength - index, System.Net.Sockets.SocketFlags.None);
                    //    ms.Write(binary, 0, count);
                    //}

                    //缓冲区大小
                    int bufferLength=0;
                    //实际读取字节数
                    int realReadCount = 0;
                    while (realReadCount < jsonlength)
                    {
                        if (realReadCount + socketLength < jsonlength)
                            bufferLength = socketLength;
                        else
                            bufferLength = jsonlength - realReadCount;
                        byte[] binary = new byte[bufferLength];
                        int count = TcpClient.Instance.Client.Receive(binary, 0, bufferLength, System.Net.Sockets.SocketFlags.None);
                        ms.Write(binary, 0, count);
                        realReadCount += count;
                    }
                    result = encoding.GetString(ms.ToArray(), 0,int.Parse(ms.Length.ToString())); 
                }               
            }
            return result;
        }

       
--------------------编程问答--------------------
 /// <summary>
        /// 获取文件
        /// </summary>
        /// <returns></returns>
        private byte [] ReceiveBinary(out string result)
        {
            result = "";

            //接收操作类型4字节
            byte[] actionID = new byte[4];
            TcpClient.Instance.Client.Receive(actionID, 0, 4, System.Net.Sockets.SocketFlags.None);
            int action = BitConverter.ToInt32(actionID, 0);

            //接收数据体长度4字节
            byte[] jsonLength = new byte[4];
            TcpClient.Instance.Client.Receive(jsonLength, 0, 4, System.Net.Sockets.SocketFlags.None);
            int jsonlength = BitConverter.ToInt32(jsonLength, 0);
            //文件数据长度
            byte[] binaryLength = new byte[4];
            TcpClient.Instance.Client.Receive(binaryLength, 0, 4, System.Net.Sockets.SocketFlags.None);
            int binarylength = BitConverter.ToInt32(binaryLength, 0);

            //按长度接收数据体
            if (jsonlength > 0)
            {
                byte[] json = new byte[jsonlength];
                TcpClient.Instance.Client.Receive(json, 0, jsonlength, System.Net.Sockets.SocketFlags.None);
                result = encoding.GetString(json, 0, jsonlength);
            }

            if (binarylength > 0)
            {                
                using (MemoryStream ms = new MemoryStream())
                {
                    //int index = 0; 
                    //while (index+socketLength < binarylength)
                    //{
                    //    byte[] binary = new byte[socketLength];
                    //    int count = TcpClient.Instance.Client.Receive(binary, 0, socketLength,System.Net.Sockets.SocketFlags.None);
                    //    ms.Write(binary, 0,count);
                    //    index += count;  
                    //}
                    //if (binarylength - index> 0)
                    //{
                    //    byte[] binary = new byte[binarylength - index];
                    //    int count=TcpClient.Instance.Client.Receive(binary, 0, binarylength - index, System.Net.Sockets.SocketFlags.None);
                    //    ms.Write(binary, 0, count);  
                    //}

                    //缓冲区大小
                    int bufferLength = 0;
                    //实际读取字节数
                    int realReadCount = 0;
                    while (realReadCount < binarylength)
                    {
                        if (realReadCount + socketLength < binarylength)
                            bufferLength = socketLength;
                        else
                            bufferLength = binarylength - realReadCount;
                        byte[] binary = new byte[bufferLength];
                        int count = TcpClient.Instance.Client.Receive(binary, 0, bufferLength, System.Net.Sockets.SocketFlags.None);
                        ms.Write(binary, 0, count);
                        realReadCount += count;
                    }
                    
                    return ms.ToArray();
                }
            }
            return null;
        }        

        /// <summary>
        /// 合并字节数组
        /// </summary>        
        /// <returns></returns>
        private byte[] CombineByte(byte[] a, byte[] b, byte[] c, byte[] d)
        {
            byte[] e = new byte[a.Length + b.Length + c.Length + d.Length];
            a.CopyTo(e, 0);
            b.CopyTo(e, a.Length);
            c.CopyTo(e, a.Length + b.Length);
            d.CopyTo(e, a.Length + b.Length + c.Length);
            return e;
        }

        /// <summary>
        /// 合并字节数组
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        /// <param name="d"></param>
        /// <param name="e"></param>
        /// <param name="f"></param>
        /// <returns></returns>
        private byte[] CombineByte(byte[] a, byte[] b, byte[] c, byte[] d, byte[] e)
        {
            byte[] f = new byte[a.Length + b.Length + c.Length + d.Length + e.Length];
            a.CopyTo(f, 0);
            b.CopyTo(f, a.Length);
            c.CopyTo(f, a.Length + b.Length);
            d.CopyTo(f, a.Length + b.Length + c.Length);
            e.CopyTo(f, a.Length + b.Length + c.Length + d.Length);
            return f;
        }
        ///<summary>
        ///获取服务器响应文本
        ///</summary>
        ///<returns>服务器响应文本</returns>
        private string GetData()
        {
            string result = string.Empty;
            try
            {
                result = Receive();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            return result;
        }
        #endregion
--------------------编程问答-------------------- 3年前我研究过半年,甚至还推荐过。但是后来才想明白这个东西实际上是“外面光”,其实比较“弱”。 --------------------编程问答--------------------
引用 2 楼 aa24741 的回复:
我是  新手,刚毕业,来公司  就让我做这个,求救啊


研究这种东西其实是不错的练兵的手段。

但是如果一个公司当真想偷来就卖,甚至一个老板以为可以任何新手现学现卖,我给你一个建议,认清你的公司吧。而且一般来说,你可能难以学到多少东西;公司可能除了带有欺骗性的一些“研究成果”以外可能鲜有产品。 --------------------编程问答-------------------- google SignalR 
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,