使用MVVM-Sidekick开发Universal App(一)

终于要迈进Universal的大坑了,还有点小激动呢。

CurrencyExchanger 掌中汇率是我前几年发布在Windows Phone商店中的一个应用,当时是WP7版本,下载链接:http://www.windowsphone.com/zh-cn/store/app/%E6%8E%8C%E4%B8%AD%E6%B1%87%E7%8E%87free/84e93a20-cefb-460f-b0d9-a57689b33c10

已经很久没有升级了,最近想学习一下Universal开发,就拿这个练练手吧。之前一直没有系统的写过文章,现在从头把开发中的一些过程记录一下,也是对自己的一个促进。因为是边做边写,肯定会有错误,请大家不吝赐教。

 

一、新建项目

我使用了MVVM-Sidekick框架,这是一个简单但功能强大的MVVM框架,由微软的@韦恩卑鄙 开发,我一直用这个框架开发WP8的程序,前不久作者升级支持了Universal App

新建项目前需要先安装MVVM-SidekickVS扩展插件,在VS2013update2的工具-扩展与更新菜单中搜索mvvm-sidekick就可以找到这个扩展,下载安装即可。安装后会添加项目模板和代码段,比较方便。

githubhttps://github.com/waynebaby/mvvM-Sidekick

vs插件:http://visualstudiogallery.msdn.microsoft.com/ef9b45cb-8f54-481a-b248-d5ad359ec407

现在可以新建项目了,选择通用应用程序,MVVM-Sidekick Universal App项目模板,输入CurrencyExchanger,等待VS建立项目。这个地方有个需要注意,项目名称不能太长,我第一次输入了一个比较长的名字,结果VS提示名称太长,建立失败了。

 

二、项目结构

现在可以看到VS2013为我们生成了三个项目,

CurrencyExchanger.Windows

CurrencyExchanger.WindowsPhone

CurrencyExchanger.Shared

可以看到我们熟悉的App.xaml文件被放到了Shared项目中,打开看一下,

#if WINDOWS_PHONE_APPprivate TransitionCollection transitions;
#endif

原来有好多条件编译啊,通过这种方式来区分Win8.1WP8.1,有点坑啊。

在OnLaunched方法中,有这么一行:

//Init MVVM-Sidekick Navigations:
Startups.StartupFunctions.RunAllConfig();

然后我们找到对应的文件看一下,

public static void RunAllConfig(){typeof(StartupFunctions).GetRuntimeMethods().Where(m => m.Name.StartsWith("Config") && m.IsStatic).Select(                      m => m.Invoke(null, Enumerable.Empty<object>().ToArray())).ToArray();}

这个方法对ViewViewModel进行了配置,以后新加View的话,MVVM-Sidekick会自动添加所需的ViewModel,并在这个类中进行注册,方便使用。

 

ViewModel文件夹中放着所需的VM,这个文件夹也是在Shared项目中,说明我们可以只用共享的VM去作为不同平台的ViewDataContext,实现了共享代码的目的。

 

然后看MainPage_Model.cs这个vm,这个类继承了ViewModelBase<MainPage_Model>ViewModelBaseMVVM-Sidekick的重要的一个类,所有的vm都要继承这个类。里面有一个属性Title,可以看到还带着一大坨代码,这一大坨代码是怎么出来的呢,MVVM-Sidekick提供了代码段来帮助生成,所以这就是安装VS扩展的好处。

 

通过输入 propvm ,按Tab,就会自动生成一个属性,可以方便的绑定到View上了。

 

然后我们看CurrencyExchanger.WindowsPhone项目中的MainPage.xaml,里面有这么一行:

<Page.Resources><!-- TODO: Delete this line if the key AppName is declared in App.xaml --><vm:MainPage_Model x:Key="DesignVM"/></Page.Resources>

定义了一个资源,把VM引入进来。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"  DataContext="{StaticResource DesignVM}"><TextBlock TextWrapping="Wrap" x:Name="pageTitle" Grid.Column="1"  Text="{Binding Title}" Style="{StaticResource HeaderTextBlockStyle}"/></Grid>

把这个VM作为GridDataContext,这样就可以进行绑定了,可以看到有一个TextBlockText属性绑定到了VMTitle字段。

 

大体的项目结构就是这样,下面我们就开始升级。说是升级,其实就是重新开发啊5555

 

三、建立所需的Model

货币转换这个app功能就是从雅虎财经获取不同的货币代码直接的汇率,因此首先来建立相应的Model

CurrencyExchanger.Shared项目中新建一个Models文件夹,添加一个CurrencyItem.cs,内容如下:

 public class CurrencyItem : BindableBase<CurrencyItem>{/// <summary>/// 货币代码/// </summary>public string Code{get { return _CodeLocator(this).Value; }set { _CodeLocator(this).SetValueAndTryNotify(value); }}#region Property string Code Setupprotected Property<string> _Code = new Property<string> { LocatorFunc = _CodeLocator };static Func<BindableBase, ValueContainer<string>> _CodeLocator = RegisterContainerLocator<string>("Code", model => model.Initialize("Code", ref model._Code, ref _CodeLocator, _CodeDefaultValueFactory));static Func<string> _CodeDefaultValueFactory = () => { return default(string); };#endregion/// <summary>/// 描述/// </summary>public string Description{get { return _DescriptionLocator(this).Value; }set { _DescriptionLocator(this).SetValueAndTryNotify(value); }}#region Property string Description Setupprotected Property<string> _Description = new Property<string> { LocatorFunc = _DescriptionLocator };static Func<BindableBase, ValueContainer<string>> _DescriptionLocator = RegisterContainerLocator<string>("Description", model => model.Initialize("Description", ref model._Description, ref _DescriptionLocator, _DescriptionDefaultValueFactory));static Func<string> _DescriptionDefaultValueFactory = () => { return default(string); };#endregion/// <summary>/// 图片名称/// </summary>public string Image{get { return _ImageLocator(this).Value; }set { _ImageLocator(this).SetValueAndTryNotify(value); }}#region Property string Image Setupprotected Property<string> _Image = new Property<string> { LocatorFunc = _ImageLocator };static Func<BindableBase, ValueContainer<string>> _ImageLocator = RegisterContainerLocator<string>("Image", model => model.Initialize("Image", ref model._Image, ref _ImageLocator, _ImageDefaultValueFactory));static Func<string> _ImageDefaultValueFactory = () => { return default(string); };#endregion}
View Code

这个Model要继承BindableBase<CurrencyItem>,在MVVM-SidekickBindableBase是和ViewModelBase一样重要的几个基类,用于实现可绑定的model,但区别是ViewModelBase中还会放一些Command,而BindableBase顾名思义仅用于绑定属性,不建议在里面放Command这些东西。不要看上面这么一大坨,其实就输入了几个单词而已,都是用propvm生成的。主要是三个属性,货币代码,描述,图片名称。图片用于在显示货币的时候显示一个国旗的图片。

 

与此类似再建立一个货币转换的model,新建CurrencyExchangeItem.cs文件,代码如下:

public class CurrencyExchangeItem : BindableBase<CurrencyExchangeItem>{/// <summary>/// 日期/// </summary>public DateTime TradeDate{get { return _TradeDateLocator(this).Value; }set { _TradeDateLocator(this).SetValueAndTryNotify(value); }}#region Property DateTime TradeDate Setupprotected Property<DateTime> _TradeDate = new Property<DateTime> { LocatorFunc = _TradeDateLocator };static Func<BindableBase, ValueContainer<DateTime>> _TradeDateLocator = RegisterContainerLocator<DateTime>("TradeDate", model => model.Initialize("TradeDate", ref model._TradeDate, ref _TradeDateLocator, _TradeDateDefaultValueFactory));static Func<DateTime> _TradeDateDefaultValueFactory = () => { return default(DateTime); };#endregion/// <summary>/// 汇率/// </summary>public double Rate{get { return _RateLocator(this).Value; }set { _RateLocator(this).SetValueAndTryNotify(value); }}#region Property double Rate Setupprotected Property<double> _Rate = new Property<double> { LocatorFunc = _RateLocator };static Func<BindableBase, ValueContainer<double>> _RateLocator = RegisterContainerLocator<double>("Rate", model => model.Initialize("Rate", ref model._Rate, ref _RateLocator, _RateDefaultValueFactory));static Func<double> _RateDefaultValueFactory = () => { return default(double); };#endregion/// <summary>/// 逆向汇率/// </summary>public double InverseRate{get { return _InverseRateLocator(this).Value; }set { _InverseRateLocator(this).SetValueAndTryNotify(value); }}#region Property double InverseRate Setupprotected Property<double> _InverseRate = new Property<double> { LocatorFunc = _InverseRateLocator };static Func<BindableBase, ValueContainer<double>> _InverseRateLocator = RegisterContainerLocator<double>("InverseRate", model => model.Initialize("InverseRate", ref model._InverseRate, ref _InverseRateLocator, _InverseRateDefaultValueFactory));static Func<double> _InverseRateDefaultValueFactory = () => { return default(double); };#endregion/// <summary>/// 是否为基准货币/// </summary>public bool IsStandard{get { return _IsStandardLocator(this).Value; }set { _IsStandardLocator(this).SetValueAndTryNotify(value); }}#region Property bool IsStandard Setupprotected Property<bool> _IsStandard = new Property<bool> { LocatorFunc = _IsStandardLocator };static Func<BindableBase, ValueContainer<bool>> _IsStandardLocator = RegisterContainerLocator<bool>("IsStandard", model => model.Initialize("IsStandard", ref model._IsStandard, ref _IsStandardLocator, _IsStandardDefaultValueFactory));static Func<bool> _IsStandardDefaultValueFactory = () => { return default(bool); };#endregion/// <summary>/// 货币数量/// </summary>public double Amount{get { return _AmountLocator(this).Value; }set { _AmountLocator(this).SetValueAndTryNotify(value); }}#region Property double Amount Setupprotected Property<double> _Amount = new Property<double> { LocatorFunc = _AmountLocator };static Func<BindableBase, ValueContainer<double>> _AmountLocator = RegisterContainerLocator<double>("Amount", model => model.Initialize("Amount", ref model._Amount, ref _AmountLocator, _AmountDefaultValueFactory));static Func<double> _AmountDefaultValueFactory = () => { return default(double); };#endregion/// <summary>/// 基准货币/// </summary>public CurrencyItem CurrencyBase{get { return _CurrencyBaseLocator(this).Value; }set { _CurrencyBaseLocator(this).SetValueAndTryNotify(value); }}#region Property CurrencyItem CurrencyBase Setupprotected Property<CurrencyItem> _CurrencyBase = new Property<CurrencyItem> { LocatorFunc = _CurrencyBaseLocator };static Func<BindableBase, ValueContainer<CurrencyItem>> _CurrencyBaseLocator = RegisterContainerLocator<CurrencyItem>("CurrencyBase", model => model.Initialize("CurrencyBase", ref model._CurrencyBase, ref _CurrencyBaseLocator, _CurrencyBaseDefaultValueFactory));static Func<CurrencyItem> _CurrencyBaseDefaultValueFactory = () => { return default(CurrencyItem); };#endregion/// <summary>/// 目标货币/// </summary>public CurrencyItem CurrencyTarget{get { return _CurrencyTargetLocator(this).Value; }set { _CurrencyTargetLocator(this).SetValueAndTryNotify(value); }}#region Property CurrencyItem CurrencyTarget Setupprotected Property<CurrencyItem> _CurrencyTarget = new Property<CurrencyItem> { LocatorFunc = _CurrencyTargetLocator };static Func<BindableBase, ValueContainer<CurrencyItem>> _CurrencyTargetLocator = RegisterContainerLocator<CurrencyItem>("CurrencyTarget", model => model.Initialize("CurrencyTarget", ref model._CurrencyTarget, ref _CurrencyTargetLocator, _CurrencyTargetDefaultValueFactory));static Func<CurrencyItem> _CurrencyTargetDefaultValueFactory = () => { return default(CurrencyItem); };#endregion}
View Code

这个model就是用来显示货币汇率转换的,里面有两个货币的信息还有汇率的信息等等。

 

四、初始化数据

在用户第一次进入app时,应该让用户选择要显示哪些货币的汇率,这样就要给用户提供一个货币列表,这个列表需要我们提前初始化好。

 

新建一个Context类,放一些常用的东东。在Shared项目中新建Utilities目录,添加一个Context.cs文件,做成单例。

public sealed class Context{static readonly Context instance = new Context();static Context(){}private Context(){}/// <summary>/// Gets the instance./// </summary>/// <value>The instance.</value>public static Context Instance{get{return instance;}}
}
View Code

在里面添加一个列表:

public List<CurrencyItem> AllCurrencyItemList { get; set; }

然后一个初始化方法:

public void Init(){AllCurrencyItemList = new List<CurrencyItem>(){ new CurrencyItem{Code = "AED", Description ="阿联酋迪拉姆", Image="flag_united_arab_emirates"},
new CurrencyItem{Code = "ALL", Description = "阿尔巴尼亚列克", Image="flag_albania"},
……
}

找到App.xaml.cs,在OnLaunched方法中调用此方法:

//Init Context
Context.Instance.Init();

添加货币列表是一个很枯燥的工作,当初我是从雅虎财经网页上扒下的货币代码,又从网页素材网站找到国旗的图片,挨个整理好。当然也可以事先整理成xml来读取。

慢着,我的WP7程序就是支持多语言的,此时当然不能把货币描述直接hard code,而应该从资源文件中按照用户当前的语言来显示。

 

好吧又多了一个问题,多语言。

 

五、可以叫全球化多语言本地化……反正就是可以让用户选择语言

以前的WP7多语言需要自己搞一大坨代码,到了WP8方便了一点,VS会帮助干很多事。但到了Universal,情况又变了。WP8添加资源文件的时候资源文件格式为resx,同时程序会自动添加一个AppResouces.Designer.cs,通过一个全局的ResourceManager去取得资源文件中的字符串,代码中可以直接调用:

String appName = AppResources.AppName;

是不是很方便?

到了Universal里,自动生成的没有了,添加的资源文件格式变成了resw,需要用这种方式来调用:

var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
var string = loader.GetString('Farewell');

是不是很坑?万一字符串写错了就找不到了。

添加多语言文件倒不麻烦,有多语言工具包,链接:http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/jj572370.aspx

但是调用显得不太友好。所以我仿照WP8的方式新建了一个AppResources.cs,放到Utilities,里面这样写:

public static class AppResources{public static ResourceLoader CurrentResourceLoader{get{return ResourceLoader.GetForCurrentView();}}public static string AppName{get{return CurrentResourceLoader.GetString("AppName");}}
。。。。。。
}

只要保证这里写对,这样以后调用的时候就不怕出错了。

多语言资源文件的添加比较简单,有工具包协助,甚至翻译都可以帮你做好,具体步骤见

http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/jj572370.aspx

 

需要注意的是,以前的方式需要我们为每种语言建立一个资源文件,现在有多语言工具包就不需要了,只添加一个默认语言的即可,工具包会自动填充其他的语言。比如CurrencyExchanger默认语言是英语,那么步骤就是:

打开Package.appxmanifest文件,把默认语言改成en-US,然后添加一个Strings文件夹,下面添加en-US文件夹,添加一个Resources.resw资源文件,在这里面编辑所需要的字符串。

右键单击CurrencyExchanger.WindowsPhone,选择添加翻译语言,

这样会自动建立一个MultilingualResources文件夹,里面是一大坨xlf后缀的文件,qps-ploc.xlf这个是伪语言,用于测试的,在其他的几个文件上点右键,选择打开方式,选择多语言编辑器,出来这么一个东东:

看到菜单没有,点翻译,Microsoft Translator直接就帮你翻译好了。当然还需要进一步校对,但已经很智能化了。这样就不需要为每种语言建资源文件了,可以从这些xlf文件里找。需要注意的是,如果你的程序选择了zh-CN的默认语言,就不能再有zh-CN.xlf的多语言资源,否则会提示错误,删掉重复的即可。你也可以在xlf文件上右键发送邮件给朋友,翻译完了再导入进来。

 

呼呼,先别管翻译的准不准,代码里我们可以这样初始化货币列表了:

AllCurrencyItemList = new List<CurrencyItem>(){ new CurrencyItem{Code = "AED", Description = AppResources.AED, Image="flag_united_arab_emirates"},
new CurrencyItem{Code = "ALL", Description = AppResources.ALL, Image="flag_albania"},
//new CurrencyItem{Code = "ANG", Description = AppResources.ANG, Image=""},
new CurrencyItem{Code = "ARS", Description = AppResources.ARS, Image="flag_argentina"},
。。。。。
}

因为是从资源文件中读取的货币描述,所以在UI会显示和用户系统匹配的语言。

未完待续。

转载于:https://www.cnblogs.com/yanxiaodi/p/3800767.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何检测本计算机耗电量,如何查看电脑耗电量?鲁大师查看电脑使用功率的方法...

【www.xinr41319.cn--电脑网络】查看自己电脑的电源功率有两大好处&#xff0c;第一知道给台式电脑配置多大的电源&#xff0c;第二可以精确的算出&#xff0c;一台电脑&#xff0c;一天一般消耗多少电&#xff0c;那么小编教大家来查看一下自己电脑的功率是多少。我们可以要借…

【转载】COM小结

原文&#xff1a;http://blog.csdn.net/byxdaz/article/details/6595210 一、Com概念 所谓COM&#xff08;Componet Object Model&#xff0c;组件对象模型&#xff09;&#xff0c;是一种说明如何建立可动态互变组件的规范&#xff0c;此规范提供了为保证能够互操作&#xff0…

解决Dropbox无法连接的问题

同步共享服务Dropbox从6月18日开始再次遭到封锁&#xff0c;原因是DNS污染。Dropbox上次在2010年5月曾遭到IP封锁和网址关键字过 滤&#xff0c;2012年5月除文件外链功能外其它功能可正常访问&#xff1b;2014年2月全部功能都可以正常访问。中国正展开净网行动&#xff0c;文件…

RDLC报表系列一

1、报表项目搭建&#xff1a; 配置好后&#xff0c;单击Web服务URL:http://lg-20151517ryre/ReportServer 如果电脑系统打开的时候没有设置密码的话&#xff0c;此时打开有可能会出现需要登录名和密码。如出现此种情况可给Administrator设置密码。然后刷新当前页面就可以看大上…

ADS-B显示终端5.9

更改日志 1 更新背景地图。增加了全国范围内的VOR电台、DME、NDB导航台信息&#xff0c;包含有坐标信息、代码信息、频率等内容。 VOR电台、DME、NDB导航台信息来自中国民航局公布的航行情况资料汇编。VOR、DME、NDB分别採用不同的图形绘制&#xff0c;目标均採用淡绿色画笔…

域名自动跳转不搭建服务器,宝塔搭建的服务器WEB系统环境如果做域名301跳转

宝塔搭建的服务器WEB系统环境如果做域名301跳转今天老蒋遇到一个网友&#xff0c;服务器WEB系统环境是用宝塔搭建的&#xff0c;搭建的网站绑定过WWW域名和不带WWW域名&#xff0c;他是希望能全部统一到WWW的域名&#xff0c;这里应该是他程序没有自带301跳转&#xff0c;如果是…

OpenCV Python教程(1、图像的载入、显示和保存)

本文是OpenCV 2 Computer Vision Application Programming Cookbook读书笔记的第一篇。在笔记中将以Python语言改写每章的代码。 PythonOpenCV的配置这里就不介绍了。 注意&#xff0c;现在OpenCV for Python就是通过NumPy进行绑定的。所以在使用时必须掌握一些NumPy的相关知识…

大华出入口管理系统H710服务器配置,DH-DSS-H710S2 大华出入口综合管理系统 停车场收费 支持人脸相机设备添加...

DH-DSS-H710S2 大华出入口综合管理系统 支持车辆列表展示&#xff0c;包括车辆编号、车牌、车场、车辆品牌、车辆类型、车身颜色、车主等信息 支持通过人员编号、姓名进行人员信息查询 支持打印小票与导出缴费信息 DH-DSS-H710S2DH-DSS-H710S2大华出入口综合管理系统DH-DSS-H71…

微软块级备份引擎服务器,文件级与块级备份区别

首先我们先来了解一下&#xff0c;什么叫做块级&#xff1f;什么叫文件级&#xff1f;1.块级概念&#xff1a;块级是指以扇区为基础&#xff0c;一个或我连续的扇区组成一个块&#xff0c;也叫物理块。它是在文件系统与块设备(例如&#xff1a;磁盘驱动器)之间。2.文件级概念&a…

通过物理映射往虚拟机中传输数据

1、在虚拟机管理界面&#xff0c;找到硬盘&#xff0c;双击 2、在跳出的页面中点击“映射” 3、在弹出的页面中将“以只读模式打开文件”选项勾去 4、选择是“”是 5、这个时候就看到电脑上出现了一个“Z盘”&#xff0c;此时就可以将需要复制进虚拟机的文件&#xff0c;复制…

Ubuntu12.04版本安装arm-linux-gcc 4.3.3

由于Ubuntu12.04是64位系统,如果安装4.3.3版本的arm gcc,系统将会找到,所以要让其可用,就要安装ia32-lib包,以便让系统使用32bit软件: apt-get install ia32-libs 由于我前面已将安装好了gcc 4.3.3并且设置好了环境变量,所以安装完上面以后就可以查看gcc信息了: arm-linux-gcc …

[Algorithm] 字符串匹配算法——KMP算法

1 字符串匹配 字符串匹配是计算机的基本任务之一。 字符串匹配是什么&#xff1f;举例来说&#xff0c;有一个字符串"BBC ABCDAB ABCDABCDABDE"&#xff0c;我想知道&#xff0c;里面是否包含另一个字符串"ABCDABD"&#xff1f; 许多算法可以完成这个任务&…

服务器共享文件审计,内网安全管理系统-共享审计

在现代企事业单位的网络中&#xff0c;最常用的功能莫过于“共享文件”了。财务部门需要当月员工的考勤信息&#xff0c;人事部门可能不会亲自拿过去&#xff0c;而是在网络上共享&#xff1b;生产部门的生产报表也不会用书面的资料分发&#xff0c;而是放在网络的共享文件夹下…

介绍“Razor”— ASP.NET的一个新视图引擎

我的团队当前正在从事的工作之一就是为ASP.NET添加一个新的视图引擎。 一直以来&#xff0c;ASP.NET MVC都支持 “视图引擎”的概念—采用不同语法的模板的可插拔模块。当前ASP.NET MVC “默认”的视图引擎是ASP.NET Web窗体使用的.aspx/.ascx/.master文件模板。而当今其他一些…

w10系统打印服务器怎样出来,win10怎么打开关闭打印机服务教程步骤

当我们想要使用打印机服务时候&#xff0c;却不知道在哪里打开&#xff0c;对于win10系统&#xff0c;具体怎么操作呢?下面小编来告诉你开启和关闭打印机服务的方法吧&#xff0c;希望对你有帮助!Win10系统开启和关闭打印机服务的方法1、在Win10系统下&#xff0c;按住键盘的“…

MongoDB系列二

简介 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个高性能&#xff0c;开源&#xff0c;无模式的文档型数据库&#xff0c;是当前NoSql数据库中比较热门的一种。 MongoDB是一个介于关系数据库和非关…

C++11的静态断言

断言就是将一个返回值总是需要为真的判别式放在语句中&#xff0c;来排除在设计的逻辑上不应该出现的情况。C11标准中引入了静态断言&#xff1a;static_assert 在C标准中&#xff0c;<cassert>或assert.h为我们提供了assert宏&#xff0c;但是这个宏只有在运行时才进行…

C# DataTable去除重复,极其简便、简单

其中sourceDT是获取到的一个DataTable类型的集合对象 去重复使用方式&#xff1a; 实例化一个DataView对象 假设为dv&#xff0c;直接dv.ToTable()即可&#xff0c;ToTable中可为&#xff08;true,"用于判断重复的列"&#xff09;&#xff0c;比如图中所示&#xff0…

环形矩阵

1.逆时针 代码&#xff1a; 1 // huanxingjz.cpp : Defines the entry point for the console application.2 //3 4 #include "stdafx.h"5 #include <stdio.h>6 #include <iostream>7 #include "windows.h"8 #define MAX 409 using namespace …

Winsock网络编程笔记(4)----基本的理论知识

前面的笔记记录了Winsock的入门编程&#xff0c;领略了Winsock编程的乐趣。。但这并不能算是掌握了Winsock&#xff0c;加深理论知识的理解才会让后续学习更加得心应手。。因此&#xff0c;这篇笔记将记录一些有关Winsock的基本理论知识&#xff0c;由于是一篇笔记&#xff0c;…