zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    TCP/IP 基础知识
    30 岁的码农人生 ——人生至暗时,你依然能窥见光明
    巨经典论文!推荐系统经典模型Wide & Deep
    带你领略拼多多2020校招笔试题,这样的难度你可以搞定吗?
    做业务、做技术和打杂,你的职场现状是哪种?
    内卷预警,本科生真的很不适合算法岗位吗?
    codeforces 1424J,为了过这题,我把祖传的C++都用上了!
    有了Git这个操作,我再也不怕代码混乱了!
    学会了这一招,距离Git大神不远了!
    好端端的数据结构,为什么叫它SB树呢?
  • 原文地址:https://www.cnblogs.com/tianjinquan/p/1844516.html
Copyright © 2011-2022 走看看