/// <summary> /// 初始化Socket服务 /// </summary> private void InitializeSocketService() { var connector = new AsyncSocketConnector(); connector.SessionConfig.ReadBufferSize = 2048; connector.SessionConfig.SetIdleTime(IdleStatus.BothIdle, 10); // 添加过滤器 var demuxingCodec = new DemuxingProtocolCodecFactory(); demuxingCodec.AddMessageEncoder<IClientInfo, ClientInfoProtocolEncoder>(); demuxingCodec.AddMessageEncoder<IList<IFileHash>, FileHashesProtocolEncoder>(); demuxingCodec.AddMessageDecoder<TransferingZipFileProtocolDecoder>(); demuxingCodec.AddMessageDecoder<UpdateFileCollectionProtocolDecoder>(); connector.FilterChain.AddLast("codec", new ProtocolCodecFilter(demuxingCodec)); connector.FilterChain.AddLast("logger", new LoggingFilter()); // 添加业务逻辑 var demuxingHandler = new DemuxingIoHandler(); demuxingHandler.AddReceivedMessageHandler(new UpdateFileCollectionMessageHandler((s, o) => { //客户端收到服务器发来的更新文件名列表后,显示更新信息,分析本地文件、计算本地文件Hash,并发给服务器 //通知ViewModel更新UpdateInfo属性 var aggregator = ServiceLocator.Current.GetInstance<IEventAggregator>(); aggregator.GetEvent<UpdateFileCollectionEvent>().Publish(o); //获取目标应用路径的绝对路径 var appFolder = Settings.Default.TargetApplicationFolder; appFolder = Path.GetFullPath(appFolder); if (!Directory.Exists(appFolder)) { // TODO 目标目录不存在 //MessageBox.Show("目标目录不存在"); } //计算Hash var fileHashes = new List<IFileHash>(); foreach (var file in o) { var filePath = Path.Combine(appFolder, file); var fileHash = new FileHash { FileName = file }; if (File.Exists(filePath)) { fileHash.HashBytes = FileHashHelper.ComputeFileHash(filePath); } fileHashes.Add(fileHash); } s.Write(fileHashes); })); demuxingHandler.AddReceivedMessageHandler(new TransferingZipFileMessageHandler((s, o) => { // TODO 客户端收到服务器发来的更新文件压缩包后,停止正在运行的应用程序,备份旧文件,覆盖新文件 })); connector.Handler = demuxingHandler; Container.RegisterInstance<IoConnector>(connector, new ContainerControlledLifetimeManager()); }
/// <summary> /// 初始化Socket服务 /// </summary> private void InitializeSocketService() { var acceptor = new AsyncSocketAcceptor(); acceptor.SessionConfig.ReadBufferSize = 2048; acceptor.SessionConfig.SetIdleTime(IdleStatus.BothIdle, 10); // 添加过滤器 var demuxingCodec = new DemuxingProtocolCodecFactory(); demuxingCodec.AddMessageEncoder<ITransferingZipFile, TransferingZipFileProtocolEncoder>(); demuxingCodec.AddMessageEncoder<IUpdateFileCollection, UpdateFileCollectionProtocolEncoder>(); demuxingCodec.AddMessageDecoder<ClientInfoProtocolDecoder>(); demuxingCodec.AddMessageDecoder<FileHashesProtocolDecoder>(); acceptor.FilterChain.AddLast("codec", new ProtocolCodecFilter(demuxingCodec)); acceptor.FilterChain.AddLast("logger", new LoggingFilter()); // 添加业务逻辑 var demuxingHandler = new DemuxingIoHandler(); demuxingHandler.AddReceivedMessageHandler(new ClientInfoMessageHandler((s, o) => { // TODO 服务器收到客户端发来的客户端信息后,校验MachineID,AppBranchID, // Serial,Expiration等信息(见数据库,见AppUpdateServer.Models.ClientInfo类), // 将更新文件名列表发给客户端 })); demuxingHandler.AddReceivedMessageHandler(new FileHashesMessageHandler((s, o) => { // TODO 服务器收到客户端发来的文件Hash后,在服务器端对比Hash,并将Hash不同的文件打包成压缩包发送给客户端 })); acceptor.Handler = demuxingHandler; Container.RegisterInstance<IoAcceptor>(acceptor, new ContainerControlledLifetimeManager()); }