C/S架构的特点
概念:Client-Server,客户端对服务器模式
特点:在参与网络通信的所有节点中,有一个明显的节点作为服务器,其他节点充当客户端。一台服务器为多个客户端提供服务。
缺点:
客户端操作不便
客户端维护成本较高,一旦软件有了版本更新,那么所有的客户端全部都需要重新下载最新版本的程序。
优点:
充分发挥客户端PC机的运算能力,利用PC机本地的硬件资源处理业务功能,只需要向服务器发送少量的处理结构即可。所以,C/S架构极大程度降低了服务器端的压力。充分发挥客户端PC机的运算能力,适合做一些特效的渲染,能够展示出非常美观、逼真的视觉效果。因为与服务器端只需要进行少量数据交互,所以基于C/S架构的应用程序往往能达到特别快的响应速度。
B/S架构特点
概念:Browser-Server,浏览器对服务器模式。
特点:B/S和C/S并不是两种完全不同的架构,实际情况是B/S架构就是一种特殊的C/S架构。或者可以说B/S架构就是在C/S的基础上演变得来的,是一种特殊的C/S架构。固定了用户操作客户端的方式为浏览器软件。
缺点:
几乎客户端不做数据处理,所有的处理都由服务器端统一完成,所以在B/S架构中服务器端的压力往往较大。
浏览器能够渲染出的视觉效果十分有限,所以仅仅适用于以文字、图片为主的信息展示,不适合做特效展示,例如游戏。
优点:
使用非常简单,只要有一台能联网的计算机,计算机中装有任意一款浏览器软件,就可以访问任何一个应用程序。
实现了客户端“零维护”,如果需要更新版本,只需要在服务器端将前后端代码进行更新,对于客户端来讲永远看到的都是最新版本。因为C/S架构中视图界面是依赖于下载安装好的保存在自己磁盘本地的代码解析得来,而B/S架构用户看到的视图界面是通过每次发送HTTP请求,由服务器现场返回HTML代码,再经浏览器解释执行渲染生成的。
端口号、IP地址基本知识
IP地址
IP地址就是标识一个主机在网络上的位置信息
IP地址就和日常生活中我们谈到的地址差不多,在计算机中,使用一个32位整数来表示这个IP地址,由于这个32位整数往往比较大,肉眼看起来不太方便。为了更好的进行表示,更方便进行查看和记忆,于是就引入了便于查看和记忆的一种表示方式:点分十进制
使用三个点,把这个32位的整数分成四个部分,每个部分都是一个一个字节的整数。每个部分的取值范围,就是0~255.*
特殊IP
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输)
静态呈现、动态呈现
静态呈现关注的是事物本身在某一个点的 组成结构和分解,而动态呈现关注的是不是事物的分解,而是事物的发展阶段和发展过程。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
前台线程、后台线程。
前台线程:应用程序必须运行完所有的前台线程才能退出,默认创建的线程都是前台线程。
后台线程:应用程序可以不必考虑后台线程是否已经运行完毕(包括正常退出和异常退出),只要所有的前台线程结束,后台线程自动结束。
一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。 而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。
Process类如何关闭进程,两种关闭进程的方法及应用场合
线程、辅助线程的基本知识
主线程:即UI线程;
从主线程通过Thread.Start或AsyncDelegate.BeginEnvoke(可带参数、定义回调方法、避免轮询)将进入辅助线程;采用异步的方式调用委托可以在界面重绘时避免工作线程被阻塞;
从主线程中调用委托的AsyncDelegate.EndEnvoke方法将进入辅助线程(EndInvoke()是阻塞方法,在回调方法中调用EndInvoke可以获得异步调用的方法的返回值),并等待结束。
辅助线程:即工作线程;
从辅助线程通过调用任何控件的Controls.Invoke方法或Controls.BeginInvoke可以切换回到主线程;并将Invoke/BeginInvoke()中的那个object数组类型的参数传递给委托参数供委托作为参数执行。
切记:AsyncDelegate.BeginEnvoke参数中的回调方法是在辅助线程中执行的,而不是在主线程中。这意味着你永远不要企图在类似的回调方法中去实现UI的更新!(这意味着回调方法同步调用的方法也在辅助线程中执行)
如何创建线程?
利用Tread类直接开启线程
- 位于System.Threading下面
- 可以直接new出来一个线程实例,将方法作为构造器参数
- 然后 实例.Start() 才开启线程
void method1(Object str){ Console.WriteLine("输入的数据:"+str); }
Thread t = new Thread(method1);
t.Start("我很好")
通过Lambda表达式
string name = "job";
Thread t = new Thread( ()=>Console.WriteLine(name) );
t.Start()
利用线程池
- 位于System.Threading 下面
- 线程池中的线程都是后台线程
- 不能把入池的线程改为前台线程
- 不能给入池的线程设置优先级或名称
- 入池的线程只能用于时间比较短的任务
- 利用线程池发起一个线程,方法必须要有一个参数
- 这和其定义的委托类型有关系
void ThreadMethod(object name){Console.WriteLine("我的名字:"+name);}
ThreadPool.QueueUserWorkItem(ThreadMethod);
利用任务
- 可以new 出来一个任务实例,将方法作为构造参数传递,然后开启任务即可
- 通过TaskFctory.StartNew( TaskMethod ); 静态方法来开启
//第一种方法
Task task = new Task(()=>{ Console.WriteLine("大声喊出我的名字!"); });
task.Start();
//第二种方法
TaskFactory sd = new TaskFactory();
sd.StartNew(() => Console.WriteLine(6 + 3));
多线程如何并发执行?什么是并发执行?
多线程如何并发执行:
1.创建线程池
// newFixedThreadPool是固定线程池,10代表线程池数量
ExecutorService pool = Executors.newFixedThreadPool(10);
2.写for循环,并且在for循环中创建Runnable对象
for (int i = 0 ; i < groupValues.size() ; i++) {
SitGroupPortray groupValue = groupValues.get(i);
// 创建Runnable对象
Runnable runnable = new Runnable() {
// 重写runnable对象中的run方法
@Override
public void run() {
// 业务逻辑
}
};
// 步骤1 中创建的线程池对runnable对象调用
pool.execute(runnable);
}
3.关闭线程池
// 步骤1 中线程池,进行关闭
pool.shutdown();
4.所有线程执行完毕?
while(true){
if(pool.isTerminated()){
break;
}
}
并发:一个CPU,同一时间,有多个任务在执行。但并发不是真正意义上的“同时进行”,只是将CPU划分成好几个时间片段,每个片段内执行一个任务,然后在这几个片段之间来回切换,由于CPU处理速度快,让用户感觉像是多个任务在同时执行。
什么是线程同步? lock语句的作用。
lock 语句获取给定对象的互斥 lock,执行语句块,然后释放 lock。 持有 lock 时,持有 lock 的线程可以再次获取并释放 lock。 阻止任何其他线程获取 lock 并等待释放 lock。 lock 语句可确保在任何时候最多只有一个线程执行其主体。
WCF特点
WCF 支持多种 通信协议 Http/Https 、TCP/UDP、MSMQ、命名管道、对等网、 消息可达性、事务流等。 WCF 可以与ASP.NET 集成、共享一个上下文(HttpContext)。 WCF 支持多种消息传输格式 :text,binary,mtom,Json 等。 WCF 安全性要强:支持对称安全、非对称安全、消息安全、传输安全、 SSL 流安全、Windows 流安全等
WCF终结点
Windows Communication Foundation (WCF) 服务的所有通信都通过服务的终结点进行。 利用终结点,客户端可访问 WCF 服务提供的功能。
每个终结点包含四个属性:
-
一个指示可以查找终结点的位置的地址。
-
一个指定客户端如何与终结点进行通信的绑定。
-
一个标识可用操作的协定。
-
一组指定终结点的本地实现细节的行为。
-
地址:地址唯一地标识终结点,并告诉服务的潜在客户其所在的位置。 在 WCF 对象模型中,地址由 EndpointAddress 类表示。 一个 EndpointAddress 类包含:
-
绑定:绑定指定如何与终结点进行通信。 这包括:
-
要使用的传输协议(例如,TCP 或 HTTP)。
-
要用于消息的编码(例如,文本或二进制)。
-
必需的安全要求(例如,SSL 或 SOAP 消息安全)。
-
-
协定:协定概述了终结点向客户端公开的功能。 协定指定:
-
客户端可以调用的操作。
-
消息的窗体。
-
调用操作所需的输入参数或数据的类型。
-
客户端可以预期的处理或响应消息的类型。
-
-
行为:可以使用终结点行为来自定义服务终结点的本地行为。 终结点行为是通过参与构建 WCF 运行时的过程来实现这一点的。 终结点行为的一个示例是 ListenUri 属性,可以利用该属性指定与 SOAP 或 Web 服务描述语言 (WSDL) 地址不同的侦听地址。
WCF消息通信方式。
WCF在通信过程中有三种模式:请求与答复、单向、双工通信。
请求与答复
客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序
[OperationContract]
string ShowName(string name);
单向
客户端向服务端发送求,但是不管服务端是否执行完成就接着执行下面的程序。
[OperationContract(IsOneWay = true)]
void ShowName(string name);
特点:使用 IsOneWay=true 标记的操作不得声明输出参数、引用参数或返回值。
双工通信
双工模式建立在上面两种模式的基础之上,实现客户端与服务端相互的调用。相互调用:以往我们只是在客户端调用服务端,然后服务端有返回值返回客户端,而相互调用不光是客户端调用服务端,而且服务端也可以调用客户端的方法
支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用NetTcpBinding为例
服务端:
[ServiceContract(CallbackContract =typeof(IDongCallBack))]
public interface IPuseService
{
[OperationContract]
string DoWork(string name);
}
public class PuseService : IPuseService
{
public string DoWork(string name)
{
var callBack= OperationContext.Current.GetCallbackChannel<IDongCallBack>();
callBack.GetName("双工"+ name);
return "WCF服务";
}
}
public interface IDongCallBack
{
[OperationContract(IsOneWay =true)]
void GetName(string name);
}
配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="false" 【有坑,必须改成false】 httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="T_WCF.PuseService">
<endpoint address="" binding="netTcpBinding"【必须改】 contract="T_WCF.IPuseService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding"【必须改】 contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="【必须改】net.tcp://localhost:8733/Design_Time_Addresses/T_WCF/PuseService/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
客户端:
class Program
{
static void Main(string[] args)
{
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
PuseServiceClient client = new PuseServiceClient(instanceContext);
var result = client.DoWork("wds");
Console.WriteLine(result);
Console.ReadKey();
}
}
class CallbackHandler : IPuseServiceCallback【这个需要F12进入PuseServiceClient,看里面的回调名称 】 { public void GetName(string name) { Console.WriteLine(name); } }