B/S于C/S的区别

B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。B/S结构,主要是利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着Windows   98/Windows   2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构。显然B/S结构应用程序相对于传统的C/S结构应用程序将是巨大的进步。   
  
    B/S结构采用星形拓扑结构建立企业内部通信网络或利用Internet虚拟专网(VPN)。前者的特点是安全、快捷、准确。后者则具有节省投资、跨地域广的优点。须视企业规模和地理分布确定。企业内部通过防火墙接入Internet,再整个网络采用TCP/IP协议。   
  
  C/S   与   B/S   区别:     
    Client/Server是建立在局域网的基础上的.Browser/Server是建立在广域网的基础上的.     
  1.硬件环境不同:     
    C/S   一般建立在专用的网络上,   小范围里的网络环境,   局域网之间再通过专门服务器提供连接和数据交换服务.   
    B/S   建立在广域网之上的,   不必是专门的网络硬件环境,例与电话上网,   租用设备.   信息自己管理.   有比C/S更强的适应范围,   一般只要有操作系统和浏览器就行     
  2.对安全要求不同     
    C/S   一般面向相对固定的用户群,   对信息安全的控制能力很强.   一般高度机密的信息系统采用C/S   结构适宜.   可以通过B/S发布部分可公开信息.   
    B/S   建立在广域网之上,   对安全的控制能力相对弱,   面向是不可知的用户群.     
  3.对程序架构不同     
    C/S   程序可以更加注重流程,   可以对权限多层次校验,   对系统运行速度可以较少考虑.   
    B/S   对安全以及访问速度的多重的考虑,   建立在需要更加优化的基础之上.   比C/S有更高的要求   B/S结构的程序架构是发展的趋势,   从MS的.Net系列的BizTalk   2000   Exchange   2000等,   全面支持网络的构件搭建的系统.   SUN   和IBM推的JavaBean   构件技术等,使   B/S更加成熟.     
  4.软件重用不同     
    C/S   程序可以不可避免的整体性考虑,   构件的重用性不如在B/S要求下的构件的重用性好.   
    B/S   对的多重结构,要求构件相对独立的功能.   能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子     
  5.系统维护不同     
  系统维护是软件生存周期中,开销大,   -------重要   
    C/S   程序由于整体性,   必须整体考察,   处理出现的问题以及系统升级.   升级难.   可能是再做一个全新的系统   
    B/S   构件组成,方面构件个别的更换,实现系统的无缝升级.   系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.     
  6.处理问题不同     
    C/S   程序可以处理用户面固定,   并且在相同区域,   安全要求高需求,   与操作系统相关.   应该都是相同的系统   
    B/S   建立在广域网上,   面向不同的用户群,   分散地域,   这是C/S无法作到的.   与操作系统平台关系最小.     
  7.用户接口不同     
    C/S   多是建立的Window平台上,表现方法有限,对程序员普遍要求较高   
    B/S   建立在浏览器上,   有更加丰富和生动的表现方式与用户交流.   并且大部分难度减低,减低开发成本.     
  8.信息流不同     
    C/S   程序一般是典型的中央集权的机械式处理,   交互性相对低   
    B/S   信息流向可变化,   B-B   B-C   B-G等信息、流向的变化,   更象交易中心

C/S 结构示例代码

代码
1
2  ///client.cpp
3  #include <stdio.h>
4 #include <stdlib.h>
5 #include <WinSock2.h>
6  #pragma comment(lib, "ws2_32.lib ")
7
8  #define PORT 5000
9 #define BUFFER 1024
10
11
12 void main()
13 {
14
15 #pragma region socket
16 WSADATA wsaData;
17 SOCKET client;
18 int port=PORT;
19 //从服务器接收的数据长度
20 int iLen;
21 //接受数据的缓冲
22 char buf[BUFFER];
23 //服务器端地址
24 struct sockaddr_in serv;
25
26
27 //接受数据缓冲区初始化
28 memset(buf,0,sizeof(buf));
29 if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
30 {
31 printf("Winsock load failed\n");
32 return;
33 }
34 //需要连接的服务器地址信息
35 serv.sin_family=AF_INET;
36
37 //需要连接的服务器端口信息
38 serv.sin_port=htons(port);
39 //将命令行的IP地址转化为二进制表示的网络字节顺序IP地址
40 serv.sin_addr.s_addr=inet_addr("127.0.0.1");
41 //建立客户端流套接字
42 client=socket(AF_INET,SOCK_STREAM,0);
43
44 if(client==INVALID_SOCKET)
45 {
46 printf("socket()failed:%d\n",WSAGetLastError());
47 return;
48 }
49 #pragma endregion socket
50
51 #pragma region connect() 请求与服务器建立TCP连接
52 if(connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET)
53 {
54 printf("connet()failed:%d\n",WSAGetLastError());
55 return;
56 }
57 #pragma endregion connect
58
59 #pragma region recv()/send()
60 else
61 {
62 //从服务器接收数据
63 iLen=recv(client,buf,sizeof(buf),0);
64 if(iLen==0)
65 return;
66 else if(iLen==SOCKET_ERROR)
67 {
68 printf("recv()failed:%d\n",WSAGetLastError());
69 return;
70 }
71 printf("recv()data from server:%s\n",buf);
72 }
73 #pragma endregion recv()/send()
74
75 #pragma region closesocket()
76 closesocket(client);
77 WSACleanup();
78
79 #pragma endregion closesocket()
80 ///4、closesocket()
81
82
83 printf("press any key to continue"); //加了这两句,不让程序退出
84
85 while(1);
86 }
代码
1
2
3 ///server.cpp
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <WinSock2.h>
7 #pragma comment(lib, "ws2_32.lib ")
8
9 #define PORT 5000
10
11 void main()
12 {
13
14 #pragma region socket
15
16 ///1、socket
17 int port =PORT;
18 WSADATA wsaData;
19 SOCKET sListen,sAccept;
20
21 int iLen;
22 int iSend;
23
24 char buf[]="HELLO,HOW ARE YOU!";
25
26 struct sockaddr_in serv,cliet;
27
28 if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
29 {
30 printf("Winsock load failed \n");
31 return ;
32 }
33 //创建套接字
34 sListen =socket(AF_INET,SOCK_STREAM,0);
35 if (sListen ==INVALID_SOCKET)
36 {
37 printf("socket failed :%d\n",WSAGetLastError());
38 return;
39 }
40 #pragma endregion socket
41
42 #pragma region bind()
43 ///2、bind
44 //建立服务器地址
45
46 serv.sin_family =AF_INET;
47
48 serv.sin_port =htons(port);
49 serv.sin_addr.s_addr =htonl(INADDR_ANY);
50
51 if (bind(sListen,(LPSOCKADDR)&serv,sizeof(serv))==SOCKET_ERROR)
52 {
53 printf("bind()failed:%d\n",WSAGetLastError());
54 return;
55 }
56
57 #pragma endregion bind()
58
59
60 #pragma region listen()
61 ///3、listen
62
63 if (listen(sListen,5)==SOCKET_ERROR)
64 {
65 printf("listen() failed:%d\n",WSAGetLastError());
66 return;
67 }
68 #pragma endregion listen()
69
70 #pragma region accept()
71 ///4、accept
72
73 iLen =sizeof(cliet);
74 while (1)
75 {
76 sAccept =accept(sListen,(struct sockaddr *)&cliet,&iLen);
77 if (sAccept==INVALID_SOCKET)
78 {
79 printf("accept() failed:%d\n",WSAGetLastError());
80 break;
81 }
82
83 printf("accepted client IP:[%s],port:[%d]\n",inet_ntoa(cliet.sin_addr),ntohs(cliet.sin_port));
84 #pragma endregion accept()
85
86
87 ///5、阻塞、等待客户数据
88
89 #pragma region send()
90 iSend =send(sAccept,buf,sizeof(buf),0);
91 if (iSend==SOCKET_ERROR)
92 {
93 printf("send() failed:%d\n",WSAGetLastError());
94 break;
95 }
96 else if (iSend ==0)
97 {
98 break;
99 }
100 else
101 printf("send()byte:%d\n",iSend);
102 #pragma endregion send()
103
104 #pragma region closesocket()
105 closesocket(sAccept);
106 }
107 closesocket(sListen);
108 WSACleanup();
109 #pragma endregion closesocket()
110 }
111
112
原文地址:https://www.cnblogs.com/tianjinquan/p/1844516.html