本文转载自:
http://www.cnblogs.com/xblues/archive/2008/07/11/1240843.html 作者:xblues 转载请注明该声明。
看了园子里很多学习WCF的例子,感觉受益匪浅,但是由于每个人学习的侧重点不同,一些很详细的细节例如每一个属性都是用来干什么的,建立不同的项目类型对创建的服务有什么区别等等,都不得而知。终于,在MSDN上发现了一篇 入门教程。讲解的十分基本,十分详细,想进到每一个细节,然我彻底了解入门的每一个细节,整个教程结构清晰,代码简洁,讲解细致,值得推荐。
地址: http://msdn.microsoft.com/en-us/library/ms734712.aspx
做这分5部来讲解创建一个最基本的基于B/S构架的WCF应用。服务是根据输入的两个数字,返回这两个数字的加减乘除运算结果。
第一步:定义WCF服务契约(创建项目,加入引用,定义Interface)
第二部:引入WCF服务契约(添加具体服务函数)
第三部:构架WCF服务,运行WCF服务(添加Uri,定义服务对象地址,运行服务)
第四部:利用工具访问服务,自动生成WCF服务代理的代码文件
第五部:配置一个简单的WCF客户端(用客户端引入服务代理,通过服务代理来访问服务)
第六部:运行程序
先建立一个解决方案。
在这个解决方案下面建立一个叫做Server的控制台应用项目,再建立一个叫做Client的控制台应用项目。
分别给每一个项目添加引用到System.ServiceModel
编辑每个项目下面的Program.cs
客户端Program.cs代码
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.ServiceModel;
5![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
6
namespace ServiceModelSamples
7![](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
{
8![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
9
class Client
10![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
11
static void Main()
12![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
13
//Step 1: Create an endpoint address and an instance of the WCF Client.
14
EndpointAddress epAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/Service/CalculatorService");
15
CalculatorClient client = new CalculatorClient(new WSHttpBinding(), epAddress);
16![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
17![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
18
// Step 2: Call the service operations.
19
// Call the Add service operation.
20
double value1 = 100.00D;
21
double value2 = 15.99D;
22
double result = client.Add(value1, value2);
23
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
24![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
25
// Call the Subtract service operation.
26
value1 = 145.00D;
27
value2 = 76.54D;
28
result = client.Subtract(value1, value2);
29
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
30![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
31
// Call the Multiply service operation.
32
value1 = 9.00D;
33
value2 = 81.25D;
34
result = client.Multiply(value1, value2);
35
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
36![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
37
// Call the Divide service operation.
38
value1 = 22.00D;
39
value2 = 7.00D;
40
result = client.Divide(value1, value2);
41
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
42![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
43
//Step 3: Closing the client gracefully closes the connection and cleans up resources.
44
client.Close();
45![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
46
Console.WriteLine();
47
Console.WriteLine("Press <ENTER> to terminate client.");
48
Console.ReadLine();
49![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
50![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
51
}
52
}
53
}
54
服务端创建好了以后,就可以试运行了。
这时候可以用微软提供的命令行工具访问这个服务,生成服务代理 app.config 和 generatedProxy.cs两个文件。
现在就可以编辑客户端代码了。
服务端Program.cs代码
1
using System;
2
using System.ServiceModel;
3
using System.ServiceModel.Description;
4![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
5
namespace Microsoft.ServiceModel.Samples
6![](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
{
7
// Define a service contract.
8
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
9
public interface ICalculator
10![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
11
[OperationContract]
12
double Add(double n1, double n2);
13
[OperationContract]
14
double Subtract(double n1, double n2);
15
[OperationContract]
16
double Multiply(double n1, double n2);
17
[OperationContract]
18
double Divide(double n1, double n2);
19
}
20![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
21
// Service class that implements the service contract.
22
// Added code to write output to the console window.
23
public class CalculatorService : ICalculator
24![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
25
public double Add(double n1, double n2)
26![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
27
double result = n1 + n2;
28
Console.WriteLine("Received Add({0},{1})", n1, n2);
29
Console.WriteLine("Return: {0}", result);
30
return result;
31
}
32![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
33
public double Subtract(double n1, double n2)
34![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
35
double result = n1 - n2;
36
Console.WriteLine("Received Subtract({0},{1})", n1, n2);
37
Console.WriteLine("Return: {0}", result);
38
return result;
39
}
40![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
41
public double Multiply(double n1, double n2)
42![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
43
double result = n1 * n2;
44
Console.WriteLine("Received Multiply({0},{1})", n1, n2);
45
Console.WriteLine("Return: {0}", result);
46
return result;
47
}
48![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
49
public double Divide(double n1, double n2)
50![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
51
double result = n1 / n2;
52
Console.WriteLine("Received Divide({0},{1})", n1, n2);
53
Console.WriteLine("Return: {0}", result);
54
return result;
55
}
56
}
57![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
58![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
59
class Program
60![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
61
static void Main(string[] args)
62![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
63![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
64
// Step 1 of the address configuration procedure: Create a URI to serve as the base address.
65
Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");
66![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
67
// Step 1 of the hosting procedure: Create ServiceHost
68
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
69
try
70![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
71![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
72![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
73
// Step 3 of the hosting procedure: Add a service endpoint.
74
selfHost.AddServiceEndpoint(
75
typeof(ICalculator),
76
new WSHttpBinding(),
77
"CalculatorService");
78![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
79![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
80
// Step 4 of the hosting procedure: Enable metadata exchange.
81
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
82
smb.HttpGetEnabled = true;
83
selfHost.Description.Behaviors.Add(smb);
84![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
85
// Step 5 of the hosting procedure: Start (and then stop) the service.
86
selfHost.Open();
87
Console.WriteLine("The service is ready.");
88
Console.WriteLine("Press <ENTER> to terminate service.");
89
Console.WriteLine();
90
Console.ReadLine();
91![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
92
// Close the ServiceHostBase to shutdown the service.
93
selfHost.Close();
94
}
95
catch (CommunicationException ce)
96![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
{
97
Console.WriteLine("An exception occurred: {0}", ce.Message);
98
selfHost.Abort();
99
}
100
}
101
}
102
}
103
每一个细节都包含在上面的这两个Program.cs文件中了,你大概看一下就会懂。比院子里大多数教材说得都清晰,特别适合像我一样爱刨根问底的初学者。:)
最后编译程序,试运行。(两个都是命令行程序,直接到那个编译好的目录里去找那个exe文件运行,先运行服务,再运行客户端)。
看了园子里很多学习WCF的例子,感觉受益匪浅,但是由于每个人学习的侧重点不同,一些很详细的细节例如每一个属性都是用来干什么的,建立不同的项目类型对创建的服务有什么区别等等,都不得而知。终于,在MSDN上发现了一篇 入门教程。讲解的十分基本,十分详细,想进到每一个细节,然我彻底了解入门的每一个细节,整个教程结构清晰,代码简洁,讲解细致,值得推荐。
地址: http://msdn.microsoft.com/en-us/library/ms734712.aspx
做这分5部来讲解创建一个最基本的基于B/S构架的WCF应用。服务是根据输入的两个数字,返回这两个数字的加减乘除运算结果。
第一步:定义WCF服务契约(创建项目,加入引用,定义Interface)
第二部:引入WCF服务契约(添加具体服务函数)
第三部:构架WCF服务,运行WCF服务(添加Uri,定义服务对象地址,运行服务)
第四部:利用工具访问服务,自动生成WCF服务代理的代码文件
第五部:配置一个简单的WCF客户端(用客户端引入服务代理,通过服务代理来访问服务)
第六部:运行程序
先建立一个解决方案。
在这个解决方案下面建立一个叫做Server的控制台应用项目,再建立一个叫做Client的控制台应用项目。
分别给每一个项目添加引用到System.ServiceModel
编辑每个项目下面的Program.cs
![](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
![](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
1
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
2
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
3
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
4
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
5
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
6
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
7
![](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
8
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
9
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
10
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
11
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
12
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
13
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
14
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
15
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
16
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
17
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
18
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
19
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
20
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
21
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
22
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
23
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
24
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
25
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
26
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
27
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
28
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
29
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
30
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
31
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
32
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
33
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
34
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
35
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
36
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
37
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
38
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
39
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
40
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
41
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
42
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
43
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
44
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
45
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
46
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
47
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
48
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
49
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
50
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
51
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
52
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
53
![](https://i-blog.csdnimg.cn/blog_migrate/a64ee9dafc08211855da6602b1505772.png)
54
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
服务端创建好了以后,就可以试运行了。
这时候可以用微软提供的命令行工具访问这个服务,生成服务代理 app.config 和 generatedProxy.cs两个文件。
svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost:8000/ServiceModelSamples/service把这两个文件添加到客户端项目里去。
现在就可以编辑客户端代码了。
![](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
![](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
1
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
2
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
3
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
4
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
5
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
6
![](https://i-blog.csdnimg.cn/blog_migrate/156b3a452247379d066a7687077a8e2f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a9af314cccc3b1c20a00c16e7c3fb329.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
7
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
8
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
9
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
10
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
11
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
12
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
13
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
14
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
15
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
16
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
17
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
18
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
19
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
20
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
21
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
22
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
23
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
24
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
25
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
26
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
27
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
28
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
29
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
30
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
31
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
32
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
33
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
34
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
35
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
36
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
37
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
38
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
39
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
40
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
41
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
42
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
43
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
44
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
45
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
46
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
47
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
48
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
49
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
50
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
51
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
52
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
53
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
54
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
55
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
56
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
57
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
58
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
59
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
60
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
61
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
62
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
63
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
64
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
65
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
66
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
67
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
68
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
69
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
70
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
71
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
72
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
73
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
74
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
75
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
76
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
77
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
78
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
79
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
80
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
81
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
82
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
83
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
84
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
85
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
86
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
87
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
88
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
89
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
90
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
91
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
92
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
93
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
94
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
95
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
96
![](https://i-blog.csdnimg.cn/blog_migrate/8597f1d83cc2368df9f060992c3dbeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75b4174cddbc552a6e3102725c6f16ea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb07e1c50c27978e7bbc9a381a7e3faa.png)
97
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
98
![](https://i-blog.csdnimg.cn/blog_migrate/1553bc1c863899173c87ebf2aa836c76.png)
99
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
100
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
101
![](https://i-blog.csdnimg.cn/blog_migrate/cb5c401b33a814d724e38e50b0a8f214.png)
102
![](https://i-blog.csdnimg.cn/blog_migrate/a64ee9dafc08211855da6602b1505772.png)
103
![](https://i-blog.csdnimg.cn/blog_migrate/30d0d8ffd4dbf85ca6de25ae391dcc39.png)
每一个细节都包含在上面的这两个Program.cs文件中了,你大概看一下就会懂。比院子里大多数教材说得都清晰,特别适合像我一样爱刨根问底的初学者。:)
最后编译程序,试运行。(两个都是命令行程序,直接到那个编译好的目录里去找那个exe文件运行,先运行服务,再运行客户端)。