首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • (公益贴)今天2008年8月8日。。。大家一起来开源自己有用的function,利国利民。。而乐而不为呢!!! [已结贴,结贴人:fanliang11]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fanliang11
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-08 11:29:47 楼主
    自己先来晒晒。。请大家写好注释。。使用方法。。OK?
    C# code
    /// <summary> /// 根据指定的信息,调用远程WebService方法 /// </summary> /// <param name="pServicesUrl">要调用WebService的http地址</param> /// <param name="pNamespace">要调用的WebService的命名空间</param> /// <param name="pClassname">要调用的WebService的类名(不包括命名空间前缀)</param> /// <param name="pMethodname">要调用的WebService的方法名</param> /// <param name="pArgs">参数列表</param> /// <returns>WebService的执行结果</returns> /// <remarks> /// 如果调用失败,将会抛出Exception。请调用的时候,适当截获异常。 /// 异常信息可能会发生在两个地方: /// 1、动态构造WebService的时候,CompileAssembly失败。 /// 2、WebService本身执行失败。 /// </remarks> /// object obj = InvokeWebservice("http://localhost/common.asmx","Genersoft.Platform.Service.Workflow","Common","GetType",new object[]{"1"}); public object InvokeWebservice(string pServicesUrl, string pNamespace, string pClassname, string pMethodname, object[] pArgs) { try { System.Net.WebClient wc = new System.Net.WebClient(); System.IO.Stream stream = wc.OpenRead(pServicesUrl + "?WSDL"); System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream); System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter(); sdi.AddServiceDescription(sd,"",""); System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(pNamespace); System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn,ccu); Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider(); System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler(); System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if(true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(pNamespace + "." + pClassname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(pMethodname); return mi.Invoke(obj, pArgs); } catch(Exception e) { throw new Exception(e.InnerException.Message,new Exception(e.InnerException.StackTrace)); } } #endregion


    C# code
    /// <summary> /// 析构com对象 /// </summary> /// <param name="pComObj">待析构的com对象</param> ///ADODB._Recordset adoRs = null; ///ReleaseCom(adoRs); private void ReleaseCom(object pComObj) { try { if(pComObj != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(pComObj); } } catch {} finally { pComObj = null; } }

    ReleaseComObject 方法递减运行库可调用包装的引用计数。当引用计数达到零时,运行库将释放非托管 COM 对象上的所有引用,并在您试图进一步使用该对象时引发 System.NullReferenceException。如果从非托管代码向托管代码传递同一 COM 接口的次数超过一次,则包装上的引用计数将依次递增,而且调用 ReleaseComObject 将返回剩余引用的数目。
    55  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • amandag
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      5

    发表于:2008-08-08 11:34:571楼 得分:2
    收藏贴
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sxn19811006
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 13:44:152楼 得分:2
    hao
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kongwei521
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 13:50:083楼 得分:2
    啥东西。干嘛用的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjazz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 5

    发表于:2008-08-08 13:52:384楼 得分:2
    支持
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • namhyuk
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 14:34:375楼 得分:2
    楼主功底深厚啊。佩服佩服。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangkuang5
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:12:446楼 得分:2
    C# code
    public class UDPSocketService { //private static Socket ServerSocketSender; private static int ServerUDPPortSend = 6790; // private static Socket ServerSocketReceiver; private static AsyncCallback UDPReceiveCallback; //udp回调函数 private static byte[] dataBuffers; //udp字节缓存 private static EndPoint ServerEndPoint; private static IPAddress svrIPAddress; public static IPAddress ServerIPAddress { get { return UDPSocketService.svrIPAddress; } set { UDPSocketService.svrIPAddress = value; } } private static int svrUDPPortReceive = 9051; // internal static int ServerUDPPortReceive { get { return UDPSocketService.svrUDPPortReceive; } set { UDPSocketService.svrUDPPortReceive = value; } } ///// <summary> ///// 取安装本软件的服务器ip ///// </summary> ///// <returns></returns> //public static IPAddress GetLocalIP() //{ // IPHostEntry iphostentry = Dns.GetHostByName(Dns.GetHostName()); // IPAddress HostIP = null; // if (iphostentry.AddressList.Length > 0) // { HostIP = iphostentry.AddressList[0]; } // return HostIP; //} public static void UDPDataSend(byte[] data) { try { Socket ServerSocketSender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iepBroadcast = new IPEndPoint(IPAddress.Broadcast, ServerUDPPortSend);//255.255.255.255 ServerSocketSender.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); ServerSocketSender.SendTo(data, iepBroadcast); //An operation was attempted on something that is not a socket ServerSocketSender.Close(); } catch (Exception se) { BizLogic.LogWriter.AddSystemException(se); } } public static void UDPDataSendTo(byte[] data, string IPAdd) { try { if (string.IsNullOrEmpty (IPAdd) == true || IPAdd == "N/A") { return; } Socket ServerSocketSender = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iepBroadcast = new IPEndPoint(IPAddress.Parse(IPAdd), ServerUDPPortSend);//255.255.255.255 ServerSocketSender.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); ServerSocketSender.SendTo(data, iepBroadcast); ServerSocketSender.Close(); } catch (Exception se) { BizLogic.LogWriter.AddSystemException(se); } } /// <summary> /// 后台监听接收 /// </summary> public static void UDPOnListen() { try { dataBuffers = new byte[2048]; //svrIPAddress = GetLocalIP(); //System.Windows.Forms.MessageBox.Show(svrIPAddress.ToString(), svrUDPPortReceive.ToString()); ServerEndPoint = new IPEndPoint(svrIPAddress, svrUDPPortReceive); UDPReceiveCallback = new AsyncCallback(UDPDataReceived); ServerSocketReceiver = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ServerSocketReceiver.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true); //ServerSocketReceiver.Bind(ServerEndPoint);//不允许运行第二个该下载工具,在这会报异常 try { ServerSocketReceiver.Bind(ServerEndPoint);//不允许运行第二个该下载工具,在这会报异常 } catch (System.Net.Sockets.SocketException ex) { if (ex.SocketErrorCode == System.Net.Sockets.SocketError.AddressAlreadyInUse) { System.Windows.Forms.MessageBox.Show("监听端口已被其他程序占用,不能正确获得在线播放器信息,请退出程序?", "端口占用错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } throw ex; } ServerSocketReceiver.ReceiveTimeout = 5; ServerSocketReceiver.ReceiveBufferSize = 2048; ServerSocketReceiver.BeginReceiveFrom(dataBuffers, 0, dataBuffers.Length, SocketFlags.None, ref ServerEndPoint, UDPReceiveCallback, ServerSocketReceiver); } catch (Exception ex) { BizLogic.LogWriter.AddSystemException(ex); } } /// <summary> /// UDP回调 /// </summary> /// <param name="ar"></param> private static void UDPDataReceived(IAsyncResult ar) { try { Socket udpSocket = ar.AsyncState as Socket; //070128 退出时异常:由于线程退出或应用程序请求,已放弃 I/O 操作 int bytesRecved = udpSocket.EndReceiveFrom(ar, ref (EndPoint)ServerEndPoint); //当收到数据后,数据已在dataBuffers,把dataBuffers转换成可识别的结构体,依据命令类型Type //接收到的package是来自哪个ipaddress,把dataBuffers,ipaddress传过去,在第一次刷新时显示 BizLogic.DataProcessor.DataFilter(dataBuffers); System.Threading.Thread.Sleep(5); ServerSocketReceiver.BeginReceiveFrom(dataBuffers, 0, dataBuffers.Length, SocketFlags.None, ref ServerEndPoint, UDPReceiveCallback, ServerSocketReceiver); } catch (Exception ex) { BizLogic.LogWriter.AddSystemException(ex); } } public static bool IsUDPConnected() { if (ServerSocketReceiver.Connected == true)//判断UDP接受的状态 { return true; } else { return false; } } public static void Close() { if (ServerSocketReceiver == null) return; if (ServerSocketReceiver.Connected == true) { ServerSocketReceiver.Close(); } } }


    UDP通信
    自己觉得写得一般,主要是
                    BizLogic.DataProcessor.DataFilter(dataBuffers);

    解包写在回调里,希望有更高级的方式解决
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangkuang5
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:14:447楼 得分:0
    C# code
    /// <summary> /// 分析截获UDP数据包 /// </summary> public class DataProcessor { #region" 结构体struct与字节数组 byte[] 的转换 " /// 结构体转byte数组 /// </summary> /// <param name="structObj">要转换的结构体</param> /// <returns>转换后的byte数组</returns> public static byte[] StructToBytes(object structObj) { byte[] bytes; try { //得到结构体的大小 int size = Marshal.SizeOf(structObj); //创建byte数组 bytes = new byte[size]; //分配结构体大小的内存空间 IntPtr structPtr = Marshal.AllocHGlobal(size); //将结构体拷到分配好的内存空间 Marshal.StructureToPtr(structObj, structPtr, false); //从内存空间拷到byte数组 Marshal.Copy(structPtr, bytes, 0, size); //释放内存空间 Marshal.FreeHGlobal(structPtr); //返回byte数组 return bytes; } catch (Exception ex) { BizLogic.LogWriter.AddSystemException(ex); return bytes = null; } } /// byte数组转结构体 /// </summary> /// <param name="bytes">byte数组</param> /// <param name="type">结构体类型</param> /// <returns>转换后的结构体</returns> public static object BytesToStuct(byte[] bytes, Type type) { object obj; try { //得到结构体的大小 //mbox.msgbox(type.FullName); int size = Marshal.SizeOf(type); //byte数组长度小于结构体的大小 if (size > bytes.Length) { //返回空 return obj = null; } //分配结构体大小的内存空间 IntPtr structPtr = Marshal.AllocHGlobal(size); //将byte数组拷到分配好的内存空间 Marshal.Copy(bytes, 0, structPtr, size); //将内存空间转换为目标结构体 obj = Marshal.PtrToStructure(structPtr, type); //释放内存空间 Marshal.FreeHGlobal(structPtr); //返回结构体 return obj; } catch (Exception ex) { BizLogic.LogWriter.AddSystemException(ex); return obj = null; } } #endregion /// <summary> /// 数据包接收过滤器 /// </summary> public static void DataFilter(byte[] packets) { switch (packets[1]) { case 0x01: switch (packets[2]) { case 0x01: //"packets Server rec RefreshResponse" //System.Windows.Forms.MessageBox.Show("packets Server rec RefreshResponse"); DTOProcess.RefreshResponseProcessor(packets); break; 。。。。。。。。。 default: break; } break; case 0x02: switch (packets[2]) { case 0x01: //System.Windows.Forms.MessageBox.Show("packets Server rec 08-02-01");////FTP传完文件返回的消息确认? DTOProcess.GetMediaFile_TResponseProcessor(packets); break; 。。。。。 default: break; } break; case 0x03: switch (packets[2]) { case 0x01: //System.Windows.Forms.MessageBox.Show("packets Server rec 03-02-01");////FTP传完文件返回的消息确认? break; 。。。。 } break; case 0x04: switch (packets[2]) { case 0x01: //System.Windows.Forms.MessageBox.Show("packets Server rec 04-02-01");////FTP传完文件返回的消息确认? 。。。。。。 } break; default: break; } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fanliang11
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:43:408楼 得分:0
    有人共享了自己的代码。。。为表示诚意。。再共享一些代码
    C# code
    using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; using System; using System.IO; using System.Text; #region 常量定义 //压缩的级别; 压缩级别有1 - 9 private const int COMPRESS_LEVEL = 6; #endregion /// <summary> /// 将指定文件生成压缩文件 /// </summary> /// <param name="pSourceFiles"> /// 待压缩文件列表串 /// 每个文件必须是完整路径,文件与文件之间使用","半角逗号分隔 /// 压缩处理是先生成压缩文件,然后以文件流的方式依次添加待压缩的文件至压缩文件中 /// </param> /// <param name="pDestinationFileName">生成的压缩文件名</param> /// <param name="pPassword">解压密码</param> /// <param name="pInformation">操作提示信息,用于记录错误信息</param> /// <returns>如果解压成功返回true,否则返回false</returns> public bool ZipFile(string pSourceFiles, string pDestinationFileName, string pPassword, ref string pInformation) { bool isSuccess = false; try { string[] fileList = pSourceFiles.Split(','); //创建zip文件 if(CreateFile(pDestinationFileName)) { using(FileStream zipFileStream = File.OpenWrite(pDestinationFileName)) { ZipOutputStream zipStream = new ZipOutputStream(zipFileStream); //设置压缩密码 zipStream.Password = pPassword; //设置压缩级别 zipStream.SetLevel(COMPRESS_LEVEL); foreach(string srcFileName in fileList) { //添加文件至zip文件中 ZipFileIntoZip(srcFileName, ref zipStream); } zipStream.Finish(); zipStream.Close(); isSuccess = true; } } } catch(Exception e) { isSuccess = false; //删除失败的zip文件 DeleteFile(pDestinationFileName); mErrorInfo = string.Format("文件压缩失败!\r\n详细信息:{0}",e.Message); } pInformation = mErrorInfo; return isSuccess; } /// <summary> /// 解压缩指定文件 /// </summary> /// <param name="pSourceFile">待解压缩的文件全路径</param> /// <param name="pPassword">解压密码</param> /// <param name="pZipTempPath">解压临时目录</param> /// <param name="pFileList"> /// 解压后的文件名串 /// 每个文件名都是全路径表示,文件名之间用半角逗号","分隔</param> /// <param name="pInformation">操作提示信息,用于记录错误信息</param> /// <returns>解压成功时返回true,否则返回false</returns> public bool UnZipFile(string pSourceFile, string pPassword, string pZipTempPath, ref string pFileList, ref string pInformation) { bool isSuccess = false; StringBuilder fileListBuilder = new StringBuilder(); try { if(File.Exists(pSourceFile)) { if(CreateFolder(pZipTempPath)) { using(FileStream zipFileStream = File.OpenRead(pSourceFile)) { ZipInputStream zipStream = new ZipInputStream(zipFileStream); //设置压缩密码 zipStream.Password = pPassword; ZipEntry fileEntry; while ((fileEntry = zipStream.GetNextEntry()) != null) { string directoryName = Path.GetDirectoryName(fileEntry.Name); string fileName = Path.GetFileName(fileEntry.Name); if(directoryName.Length > 0) { string unZipFolder = Path.Combine(pZipTempPath, directoryName); if(!Directory.Exists(unZipFolder)) { Directory.CreateDirectory(unZipFolder); } } if (fileName != String.Empty) { string unZipFileName = Path.Combine(pZipTempPath, fileEntry.Name); unZipFileName = unZipFileName.Replace("/", @"\"); //逐个文件解压缩 UnZipFileFromZip(unZipFileName, ref zipStream); if(fileListBuilder.Length > 0) { fileListBuilder.Append(","); } fileListBuilder.Append(unZipFileName); } } zipStream.Close(); pFileList = fileListBuilder.ToString(); isSuccess = true; } } } else { mErrorInfo = "待压缩的文件不存在!"; } } catch(Exception e) { isSuccess = false; mErrorInfo = string.Format("文件解压缩失败!\r\n详细信息:{0}",e.Message); } pInformation = mErrorInfo; return isSuccess; }

    通过ICSharpCode.SharpZipLib.dll来实现压缩包进行服务器端解压的过程。。可以通过搜索这个dll文件的名字下载到
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xhan2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 16:59:129楼 得分:2
    不错,支持
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chuntian1983
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 17:13:2910楼 得分:2
    收藏啊。留个记号谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间