c#c/s结构所谓c 推送服务器端端代码,

为什么要注册?
1. 可以直接免费从本站下载代码,防止邮件发送不到您的邮箱,或登录不了国外网站
2. 可以设定关键字,当有您关心的代码收录时,邮件通知您
3. 对这里的代码进行评分和评论
4. 可以和大家一起分享你的源代码,得到更多的建议
40万国外源码搜索
200万国内源码搜索
相关源代码
C/S架构的,可以自动将服务器端的程序下载到本地,然后自动解压,用压包的EXE程序自动更新程序。可以判断版本和时间。
哈特&&热心分享
不错的程序,转载的。
C/S架构的,可以自动将服务器端的程序下载到本地,然后自动解压,用压包的EXE程序自动更新程序。可以判断版本和时间。
源代码原文下载:
Source link has yet to be found. Please, try to download it from local website.
从本站下载附件及源代码(1个附件,已经成功下载55次)
最值得关注的外文源代码
Generic TCP/IP Client/Server
评论(评论是增加积分的一个有效途径)
不怎样还可以挺好的非常好最好的
字数在300字内
请如实评论
eee&&nbsp日
suiyidodo&&nbsp日
suiyidodo&&nbsp日
200万国内源码搜索B/S和C/S架构的融合,软件客户端通过WebService接口达到自动更新和上传数据 - 烟雨江南 - ITeye博客
B/S和C/S架构的融合——软件客户端通过WebService接口达到自动更新和上传数据,支持任意客户端语言环境。
测试用例:打开客户端自动下载更新文件,上传照片
服务器环境:Tomcat 6 、eclipse 3,测试 WebService 采用 spring 2.5 + xfire 1.2.6 ,目前可升级为 cxf 2.2.3
客户端环境:Microsoft VS2008 采用C#语言。
构建服务器
package org.vv.hr.webservice.
* ISendFileWS WebService 接口
* @author 俞立全
public interface ISendFileWS {
* 读取文件大小
* @param fileName
public long getFileSize(String fileName);
* 客户端调用此方法,分块获取更新文件数据
* @param fileName 文件名
* @param offset 偏移值
* @param bufferSize 每次获取的大小
* @return 字节数组
public byte[] getUpdateFile(String fileName, int offset, int bufferSize);
* 以流形式上传文件至服务器
* @param fs
* @param fileName
* @return 服务器存储路径
public String uploadFile(byte[] fs, String fileName);
* 从服务器端以流形式下发文件
* @param path
public byte[] downFile(String path);
实现代码很简单,各有各的写法,下面重点介绍思想。
客户端: 更新进度条采用多线程ui,完整代码如下:
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.IO;
using System.X
using System.T
namespace HR_update
public partial class update : Form
/// &summary&
/// 每次下载并写入磁盘的文件数据大小(字节)
/// &/summary&
private static int BUFFER_SIZE = 128 * 1024;
//把窗体改为单态模型
private static update updateF
public static update getUpdateForm()
if (updateForm == null)
updateForm = new update();
return updateF
//构造函数改为私有,外部程序不可以使用 new() 来创建新窗体,保证了窗体唯一性
private update()
//不检查线程间操作,容许子线呈随时更新ui,微软已经不推荐使用,这里用 invoke 回调代替
//CheckForIllegalCrossThreadCalls =
InitializeComponent();
//******** 定义代理方法,解决多线程环境中跨线程改写 ui 控件属性。start ********
//定义设置一个文本的委托方法(字符串)
private delegate void setText(string log);
//定义设置一个进度的委托方法(整型)
private delegate void setProcess(int count);
//设置总进度条的最大数
private void setProgressBar1_Maximum(int count)
progressBar1.Maximum =
//设置单文件进度条的最大数
private void setProgressBar2_Maximum(int count)
progressBar2.Maximum =
//设置总进度条的当前值
private void setProgressBar1_value(int count)
progressBar1.Value =
//设置单文件进度条当前值
private void setProgressBar2_value(int count)
progressBar2.Value =
//设置总文件进度条步进进度
private void addProgressBar1_value(int count)
progressBar1.Value +=
//设置单文件进度条步进进度
private void addProgressBar2_value(int count)
progressBar2.Value +=
//设置文本框的值
private void UpdateText(string log)
textBox1.Text +=
//******** 定义代理方法,解决多线程环境中跨线程改写 ui 控件属性。 end ********
/// &summary&
/// 窗体显示时,调用 invokeThread 方法
/// &/summary&
/// &param name="sender"&&/param&
/// &param name="e"&&/param&
private void update_Shown(object sender, EventArgs e)
invokeThread();
/// &summary&
/// 开启一个线程,执行 update_function 方法
/// &/summary&
void invokeThread()
Thread th = new Thread(new ThreadStart(update_function));
th.Start();
/// &summary&
/// 自动更新方法,整合实现下面的业务逻辑。
/// &/summary&
private void update_function()
//判断 位于本地客户端程序文件夹 update 是否存在
if (Directory.Exists(Application.StartupPath + "/update"))
//存在则删除,true 表示移除包含的子目录及文件
Directory.Delete("update/", true);
//通过 webservice 从服务器端获取更新脚本文件 update.xml
getUpdateXMLFile();
//判断强制更新开关
if (isForceUpdate())
//通过 webservice 从服务器端下载更新程序文件
downloadFiles();
//比较版本号
if (verifyVersion())
//通过 webservice 从服务器端下载更新程序文件
downloadFiles();
//启动客户端主程序,退出更新程序
appExit();
/// &summary&
/// 下载 update.xml
/// &/summary&
private void getUpdateXMLFile()
//执行委托方法,更新文本控件内容
textBox1.Invoke(new setText(this.UpdateText), new object[] { "正在从服务器下载 更新脚本文件 update.xml \r\n" });
//创建一个文件传送的 webservice 接口实例
SendFileWS.ISendFileWS sendFileWS = new HR_update.SendFileWS.ISendFileWS();
//通过 webservice接口 获取服务器上 update.xml 文件的长度。
long fileSize = sendFileWS.getFileSize("update.xml");
//判断本地客户端文件夹下 update 目录是否存在
if (!Directory.Exists(Application.StartupPath + "/update"))
//不存在则创建 update 目录
Directory.CreateDirectory(Application.StartupPath + "/update");
//通过定义文件缓冲区分块下载 update.xml 文件
for (int offset = 0; offset & fileS offset += BUFFER_SIZE)
//从服务器读取指定偏移值和指定长度的二进制文件字符数组
byte[] bytes = sendFileWS.getUpdateFile("update.xml", offset, BUFFER_SIZE);
//如果 字符数组不为空
if (bytes != null)
//以追加方式打开 update.xml 文件
using (FileStream fs = new FileStream(Application.StartupPath + "/update/update.xml", FileMode.Append))
//写入数据
fs.Write(bytes, 0, bytes.Length);
fs.Close();
/// &summary&
/// 是否开启强制更新。
/// &/summary&
/// &returns&true 开启强制更新,false 比较版本号后再更新&/returns&
private bool isForceUpdate()
//开始解析 update/update.xml 新文件
XmlDocument doc = new XmlDocument();
doc.Load("update/update.xml");
XmlElement root = doc.DocumentE
//节点是否存在
if (root.SelectSingleNode("forceUpdate") != null)
//获取 forceUpdate 节点的内容
string forceUpdate = root.SelectSingleNode("forceUpdate").InnerT
if (forceUpdate.Equals("true"))
textBox1.Invoke(new setText(this.UpdateText), new object[] { "强制更新开关已打开,不再匹配版本号。 \r\n" });
//发生异常,则更新程序,覆盖 update.xml
MessageBox.Show("版本文件解析异常,服务器端 update.xml 可能已经损坏,请联系管理员。","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
/// &summary&
解析 update.xml 文件,比较version 和 subversion 判断是否有新版本
/// &/summary&
/// &returns&true 有新版本,false 版本相同&/returns&
private bool verifyVersion()
if (!File.Exists("update.xml"))
//开始解析 update.xml 旧文件
XmlDocument doc1 = new XmlDocument();
doc1.Load("update.xml");
XmlElement root1 = doc1.DocumentE
//开始解析 update/update.xml 新文件
XmlDocument doc2 = new XmlDocument();
doc2.Load("update/update.xml");
XmlElement root2 = doc2.DocumentE
if (root1.SelectSingleNode("version") != null && root1.SelectSingleNode("subversion") != null && root2.SelectSingleNode("version") != null && root2.SelectSingleNode("subversion") != null)
int old_version = Convert.ToInt32(root1.SelectSingleNode("version").InnerText);
int old_subversion = Convert.ToInt32(root1.SelectSingleNode("subversion").InnerText);
int new_version = Convert.ToInt32(root2.SelectSingleNode("version").InnerText);
int new_subversion = Convert.ToInt32(root2.SelectSingleNode("subversion").InnerText);
textBox1.Invoke(new setText(this.UpdateText), new object[] { "正在判断版本号...\r\n" });
//判断版本号和子版本号
if (old_version == new_version && old_subversion == new_subversion)
textBox1.Invoke(new setText(this.UpdateText), new object[] { "发现新版本,开始读取更新列表 \r\n" });
textBox1.Invoke(new setText(this.UpdateText), new object[] { "无法解析版本号,将下载更新全部文件...\r\n" });
catch (Exception e)
//发生异常,则更新程序,覆盖 update.xml
MessageBox.Show("版本文件解析异常,服务器端 update.xml 可能已经损坏,请联系管理员。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
/// &summary&
/// 解析 update.xml,下载更新文件
/// &/summary&
public void downloadFiles()
//解析 update.xml
XmlDocument doc = new XmlDocument();
doc.Load("update/update.xml");
XmlElement root = doc.DocumentE
XmlNode fileListNode = root.SelectSingleNode("filelist");
//获取更新文件的数量
int fileCount = Convert.ToInt32(fileListNode.Attributes["count"].Value);
//调用委托方法,更新控件内容。
textBox1.Invoke(new setText(this.UpdateText), new object[] { "更新文件数量 " + fileCount.ToString() + "\r\n" });
progressBar1.Invoke(new setProcess(this.setProgressBar1_Maximum), new object[] { fileCount });
//结束 HRClient.exe 进程?
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process process in processes)
if (process.ProcessName == "HRClient.exe")
process.Close();
//循环文件列表
for (int i = 0; i & fileC i++)
XmlNode itemNode = fileListNode.ChildNodes[i];
//获取更新文件名
string fileName = itemNode.Attributes["name"].V
//调用委托方法,更新控件内容。
textBox1.Invoke(new setText(this.UpdateText), new object[] { "正在下载文件 " + fileName + "\r\n" });
//分块下载文件,调用 webservice 接口
SendFileWS.ISendFileWS sendFileWS = new HR_update.SendFileWS.ISendFileWS();
//获取文件长度(字节)
long fileSize = sendFileWS.getFileSize(fileName);
//调用委托方法,更新进度条控件内容。
progressBar2.Invoke(new setProcess(this.setProgressBar2_Maximum), new object[] { (int)(fileSize / BUFFER_SIZE) + 1 });
progressBar2.Invoke(new setProcess(this.setProgressBar2_value), new object[] { 0 });
//通过 webservice 接口 循环读取文件数据块,每次向前步进 BUFFER_SIZE
for (int offset = 0; offset & fileS offset += BUFFER_SIZE)
Byte[] bytes = sendFileWS.getUpdateFile(fileName, offset, BUFFER_SIZE);
if (bytes != null)
//将下载的更新文件写入程序目录的 update 文件夹下
using (FileStream fs = new FileStream(Application.StartupPath + "/update/" + fileName, FileMode.Append))
fs.Write(bytes, 0, bytes.Length);
fs.Close();
progressBar2.Invoke(new setProcess(this.addProgressBar2_value), new object[] { 1 });
//替换文件
if (fileName != "HR_update.XmlSerializers.dll" || fileName != "HR_update.exe.config" || fileName != "HR_update.pdb" || fileName != "HR_update.exe")
File.Copy("update/" + fileName, fileName, true);
textBox1.Invoke(new setText(this.UpdateText), new object[] { "无法复制" + fileName + "\r\n" });
progressBar1.Invoke(new setProcess(this.addProgressBar1_value), new object[] { 1 });
//最后复制更新信息文件
File.Copy("update/update.xml"
, "update.xml", true);
/// &summary&
/// 启动客户端主程序,退出更新程序
/// &/summary&
private void appExit()
//获取主程序执行文件名
XmlDocument doc = new XmlDocument();
doc.Load("update.xml");
XmlElement root = doc.DocumentE
string executeFile = string.E
//节点是否存在
if (root.SelectSingleNode("executeFile") != null)
//获取 executeFile 节点的内容
executeFile = root.SelectSingleNode("executeFile").InnerT
//启动客户端程序
System.Diagnostics.Process.Start(Application.StartupPath + @"\" + executeFile);
//更新程序退出
Application.Exit();
客户端启动更新截图如下:采用双进度条。
下面讲讲客户端更新的流程
客户端首先从服务器下载 xml 更新配置文件,xml更新配置文件的信息如下:
&?xml version="1.0" encoding="UTF-8"?&
&forceUpdate&false&/forceUpdate&
&version&&/version&
&subversion&3&/subversion&
&filelist count="24"&
&file name="CommonLibrary.dll"&true&/file&
&file name="CommonLibrary.pdb"&true&/file&
&file name="HR_update.exe"&true&/file&
&file name="HR_update.exe.config"&true&/file&
&file name="HR_update.pdb"&true&/file&
&file name="HR_update.XmlSerializers.dll"&true&/file&
&file name="HRClient.exe"&true&/file&
&file name="HRClient.exe.config"&true&/file&
&file name="HRClient.pdb"&true&/file&
&/filelist&
&executeFile&HRClient.exe&/executeFile&
forceUpdate 节点默认为false ,如果设为true,表示每次更新不比较版本号,下载所有文件并覆盖。
version 节点为主版本号
subversion 节点为子版本号
filelist 包含了更新的文件列表
file name 为文件名 属性true表示需要更新。
executeFile 为更新程序执行完成后自动调用的主应用程序文件名,这样更新程序和主程序完全解耦,可以应用到其它系统中。
在客户端的源码中设置了每次向服务器请求的数据块大小。这也是在服务器端代码中我之前注释掉的地方,这行代码在实际应用中,应该放在客户端配置文件中,这个参数很有意义,经过测试,在不同的网络环境中(1000M、100M、10M),设置该值,对传输速度影响很大,环境越是恶劣,丢包明显,把值设小,可以加大稳定性。环境好,可以加大数值,加快传输速度。
private static int BUFFER_SIZE = 128 * 1024;
客户端上传照片的接口代码如下,也是调用了服务器的 ws 接口
WSFactory.getSendFileWS().uploadFile(commonBusiness.getBinaryFile(FileName), SafeFileName);
可以看到,J2EE
和 .NET 通过ws 还是可以很好的工作在一起的,J2EE 通过 ws 把 接口开放给 客户端,把原先客户端的公共业务逻辑放到了服务器来执行,客户端只是提交用户数据并接收服务器反馈的数据给用户,这使得客户端变得很轻,.net 提供了丰富的ui 界面组建,又大大弥补了传统J2EE B/S 架构用户界面的体验贫乏的特点。
通过WS ,J2EE 还可以和任何支持 ws 接口的语言结合,如C++、vb 、甚至 windows7 自带的 PowerShell 脚本。
这种方式灵活性很高,面对一个需求,可以有多种解决方案。可以把部分特殊业务放在客户端完成,服务器只提供权限,事务控制和持久化,也可以把业务放在服务器,客户端注意力放在用户体验上,如果单个业务繁重,还可以把服务器业务进行横向或纵向切分,多服务器节点之间通过ws传递数据。
为了加快传递速度 ws 的性能优化方式很多,这里不进行讨论了。
浏览: 83511 次
来自: 苏州
您好,实在不理解这个算法,私下请教下,给个联系方式,
派上用场了派上用场了派上用场了派上用场了
能提供下么 正需要呢~~
上面是这款源码生成器的演示,springside 是国内SSH ...有问题先搜索一下:
楼主: 发表于
12:59 [回复38次/有效37个,浏览722次]
C/S结构的程序如何实现客户端与服务端的通信
C/S结构的程序如何实现客户端与服务端的通信,请好心的大哥,大姐多多帮忙了
2楼 发表于
3楼 发表于
不是是否“高级”的问题。
C/S结构有两种解释,一种就是使用了c/s数据库的客户端工具访问数据库系统,然后就说自己是c/s结构软件了。这也没有错误,但是我们要明白他们说的c/s是什么意思。
另外一种就是业务对象服务的c/s。这种东西才是开放的。举个例子,中国移动可能开放20个api使得所有授权客户都可以去处理彩信相关的业务,它怎么可能像搞个办公室内的小程序似地毫无安全感地开放什么数据库呢?更何况后台业务复杂,怎么可能是一个数据库这种东西能够完成服务?
我只看重第二种c/s的解释。但是不可否认,许多程序员只在所接触的项目中见过第一种。
4楼 发表于
C/S有简单的两层结构即客户端直接连接数据库服务器,也有中间加了一或几层的应用服务器层。
5楼 发表于
你把要求说具体点,这样没有办法回答,呵呵
6楼 发表于
C# Socket 开发…你搜索一下这个开发的 就会有说明了
7楼 发表于
突然,我也不明白楼主想问什么了.
8楼 发表于
9楼 发表于
实际上基于c/s数据库的开发,跟基于本地数据库的开发没有太大区别,谈不上低级。我认为这种开发并不是c/s结构程序,因为应用程序基本上不处理c/s结构大系统设计所需要的任何主要环节。
10楼 发表于
抢沙发..........
11楼 发表于
12楼 发表于
通过TCP就能实现
13楼 发表于
sp1234说的好
并不是说C/S就是客户端直接访问数据库,稍微有点安全意识,都不会让你直接去访问数据库,而是通过所谓的服务器端,所有的客户端只与服务器端打交道。然后服务器端负责直接访问数据库
14楼 发表于
学了很多东西,不过问题似乎又回来了,从程序的设计角度看,如何去设计客户端和服务器端呢
15楼 发表于
16楼 发表于
帮你顶一下了
17楼 发表于
remoting,wcf,socket都可以,socket套接字比较好理解,可以直接接收字符什么的
1 你写个服务器端,构造一个socket,开始监听
2 写个客户端,也构造一个socket,连接服务器的那个(根据服务器的IP,socket开放端口连接)
就能够收发了简单的字符串什么的
3 根据需要改成传输自己的定义对象 、复杂的话改写remoting等等。
18楼 发表于
C# code
//客户端
1 using S
2 using System.Collections.G
3 ponentM
4 using System.D
5 using System.D
6 using System.T
7 using System.Windows.F
8
9 using System.N
10 using System.Net.S
11
12 namespace Client
13 {
14
public partial class ClientMain : Form
15
public ClientMain()
17
InitializeComponent();
19
private IPEndPoint ServerI
22
private Socket ClientS
23
private Byte[] MsgB
24
private Byte[] MsgS
25
private void ClientMain_Load(object sender, EventArgs e)
27
this.CmdSend.Enabled =
29
this.CmdExit.Enabled =
30
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
32
MsgBuffer = new Byte[65535];
33
MsgSend = new Byte[65535];
34
CheckForIllegalCrossThreadCalls =
35
Random TRand=new Random();
37
this.UserName.Text = "用户" + TRand.Next(10000).ToString();
38
private void CmdEnter_Click(object sender, EventArgs e)
41
ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));
43
ClientSocket.Connect(ServerInfo);
47
ClientSocket.Send(Encoding.Unicode.GetBytes("用户: " + this.UserName.Text + " 进入系统!\n"));
49
ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
51
this.SysMsg.Text += "登录服务器成功!\n";
53
this.CmdSend.Enabled =
54
this.CmdEnter.Enabled =
55
this.CmdExit.Enabled =
56
MessageBox.Show("登录服务器失败,请确认服务器是否正常工作!");
60
private void ReceiveCallBack(IAsyncResult AR)
64
int REnd = ClientSocket.EndReceive(AR);
68
this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer, 0, REnd));
69
ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
70
MessageBox.Show("已经与服务器断开连接!");
75
this.Close();
76
private void CmdSend_Click(object sender, EventArgs e)
81
MsgSend = Encoding.Unicode.GetBytes(this.UserName.Text + "说:\n" + this.SendMsg.Text + "\n");
83
if (ClientSocket.Connected)
84
ClientSocket.Send(MsgSend);
86
this.SendMsg.Text = "";
87
MessageBox.Show("当前与服务器断开连接,无法发送信息!");
91
private void CmdExit_Click(object sender, EventArgs e)
95
if (ClientSocket.Connected)
97
ClientSocket.Send(Encoding.Unicode.GetBytes(this.UserName.Text + "离开了房间!\n"));
99
ClientSocket.Shutdown(SocketShutdown.Both);
100
ClientSocket.Disconnect(false);
101
ClientSocket.Close();
103
this.CmdSend.Enabled =
105
this.CmdEnter.Enabled =
106
this.CmdExit.Enabled =
107
private void RecieveMsg_TextChanged(object sender, EventArgs e)
110
this.RecieveMsg.ScrollToCaret();
112
private void SendMsg_KeyDown(object sender, KeyEventArgs e)
115
if (e.Control && e.KeyValue == 13)
117
e.Handled =
119
this.CmdSend_Click(this, null);
120
19楼 发表于
如果是websever的话,应该怎么做呢
20楼 发表于
可能是我没有说明白,我的意思怎么实现C/S模式的应用程序
热门脚本语言:2641人阅读
所谓&B/S&是指Browser/Server(浏览器/服务器),即客户端是标准的浏览器(如Internet Explore,Netscape Navigator等),服务器端为标准的WEB服务器协同应用服务器响应浏览器的请求。 B/S模式是一种三层结构的系统。第一层客户机是用户与整个系统的接口。客户的应用程序精简到一个通用的浏览器软件,如Netscape Navigator,微软公司的IE等。浏览器将HTML代码转化成图文并茂的网页。网页还具备一定的交互功能,允许用户在网页提供的申请表上输入信息提交给后台,并提出处理请求。这个后台就是第二层的Web服务器。第二层Web服务器将启动相应的进程来响应这一请求,并动态生成一串HTML代码,其中嵌入处理的结果,返回给客户机的浏览器。如果客户机提交的请求包括数据的存取,Web服务器还需与数据库服务器协同完成这一处理工作。第三层数据库服务器的任务类似于C/S模式,负责协调不同的Web服务器发出的SQ请求,管理数据库。
c/s结构所谓&C/S&是指Client/Server(客户机/服务器)。C/S模式是一种两层结构的系统:第一层是在客户机系统上结合了表示与业务逻辑;第二层是通过网络结合了数据库服务器。 首先,交互性强是C/S固有的一个优点。在C/S中,客户端有一套完整的应用程序,在出错提示、在线帮助等方面都有强大的功能,并且可以在子程序间自由切换。B/S虽然由JavaScript、VBScript提供了一定的交互能力,但与C/S的一整套客户应用相比是太有限了。 其次,C/S模式提供了更安全的存取模式。由于C/S是配对的点对点的结构模式,采用适用于局域网、安全性比较好的网络协议(例如:NT的NetBEUI协议),安全性可以得到较好的保证。而B/S采用点对多点、多点对多点这种开放的结构模式,并采用TCP/IP这一类运用于Internet的开放性协议,其安全性只能靠数据服务器上管理密码的数据库来保证。INTERNET技术中关键的安全问题远未解决,其中信息传递过程中的加密和身份验证是关键性任务运用INTERNET技术的最大障碍,这就是现阶段INTERNET技术的主要应用仍停留于公开发布信息为主的原因。现代企业需要有开放的信息环境,需要加强与外界的联系,有的还需要通过Internet发展网上营销业务,这使得大多数企业将他们的内部网与Internet相连。由于采用TCP/IP,他们必须采用一系列的安全措施,如构筑防火墙,来防止Internet的用户对企业内部信息的窃取以及外界病毒的侵入。
B/S和C/S的区别采用C/S模式将降低网络通信量。B/S采用了逻辑上的三层结构,而在物理上的网络结构仍然是原来的以太网或环形网。这样,第一层与第二层结构之间的通信、第二层与第三层结构之间的通信都需占用同一条网络线路。而C/S只有两层结构,网络通信量只包括Client与Server之间的通信量。所以,C/S处理大量信息的能力是B/S所无法比拟的。 由于C/S在逻辑结构上比B/S少一层,对于相同的任务,C/S完成的速度总比B/S快。使得C/S更利于处理大量数据。 B/S简化了客户端。它无需象C/S模式那样在不同的客户机上安装不同的客户应用程序,而只需安装通用的浏览器软件。这样不但可以节省客户机的硬盘空间与内存,而且使安装过程更加简便。 B/S特别适用于网上信息发布。受限于HTML语言的交互性差问题,输入输出的用户互界面不能用纯INTERNET技术规范HTML/HTTP解决,因为INTERNET WWW技术的主要应用是发布信息而不是输入输出,&浏览器&是用于&浏览&而非终端输入输出!所以为了解决浏览器和HTML页面的交互性差问题,&B/S&版软件往往在客户端采用微软独家支持的ACTIVEX技术,这其实是一个由浏览器启动的客户端程序。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:57370次
排名:千里之外
原创:36篇
转载:13篇
(1)(2)(7)(1)(5)(3)(18)(11)(1)}

我要回帖

更多关于 c websocket服务器端 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信