1、客户端与服务器之间的通信模型

基于Socket连接的客户端与服务器之间的通信模型图如上图所示,整个通信过程如下所示:

(1) 服务器端首先启动监听程序,对指定的端口进行监听,等待接收客户端的连接请求;

(2)客户端程序启动,请求连接服务器的指定端口;

(3)服务器收到客户端的连接请求后与客户端建立套接字(Socket)连接;

(4)连接成功后,客户端与服务器分别打开两个流,其中客户端的输入流连接到服务器端的输出流,服务器的输入流连接到客户端的输出流,两边的流连接成功后就可以进行双向通信了。

(5)当通信完毕后,客户端与服务器端两边各自断开连接。

注:  套接字(Socket):是一种相互通信计算机之间的双向端口,具体包括主机的IP地址,服务类型,TCP/IP协议的端口。其中,TCP/IP协议的端口就是描述网络通信发送和接收的进程的标识信息,具体说就是为信息的传说提供地点。当应用程序与端口绑定后,操作系统将收到的数据发送到端口指定的应用程序进程。每个端口有一个端口号的标识符,用来区分不同的端口。端口号可以是0~65535之间的任何数字。

0~255的端口号为系统的保留端口,用于系统进程的通信;

其他的端口是自由端口,可以为进程自由使用;

已定义的端口号:Tomcat 服务器的默认通信端口是8080;

MYSQL默认的通信端口是3306;

SQLSERVER的默认通信端口是1433;

2、浏览器与服务器之(B/S)之间的通信模型


由以上1,可以看出C/S的通信模式是使用Socket来实现的,而B/S的通信模式是使用使用http来实现的。http(Hypertext transfer protocol)超文本传输协议,是一种详细规定了浏览器与万维网服务器之间相互通信的规则。

浏览器与服务器之间的通信,是一次完整的http通信过程,包括以下7个步骤:

(1) 建立TCP连接;

(2)浏览器向服务器发送请求命令(即http请求);

(3)浏览器发送请求头信息;

(4)服务器应答(即http响应);

(5)服务器发送应答头信息

(6)服务器向浏览器发送数据

(7)服务器关闭TCP连接

注: http请求与响应格式,见网址:http://www.cnblogs.com/sntetwt.html

http响应码(即当我们浏览一个网页时,有时会出现”Not Fonud  Error 505"类型的信息),如下所示:

1××  ——信息类(Information):表示收到浏览器的请求,正在进一步处理;

2×× ——成功类(successful):表示用户请求被正确接收,理解和处理;

3××——重定向类(Redirection):表示请求没有成功,客户必须采取进一步的动作;

4××——客户端错误(Client Error):表示客户端提交的请求有错;

5××——服务器错误(Server Error):表示服务器不能完成对请求的处理。

_____________________Asp.net中C#使用Socket发送和接收TCP数据示例______________________

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace ConsoleApplication1
{
    public static class SocketTest
    {
        private static Encoding encode = Encoding.Default;

/// <summary>
        /// 监听请求
        /// </summary>
        /// <param name="port"></param>
        public static void Listen(int port)
        {
            Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listenSocket.Bind(new IPEndPoint(IPAddress.Any, port));
            listenSocket.Listen(100);
            Console.WriteLine("Listen " + port + " ...");

while (true)
            {
                Socket acceptSocket = listenSocket.Accept();
                string receiveData = Receive(acceptSocket, 5000); //5 seconds timeout.
                Console.WriteLine("Receive:" + receiveData);
                acceptSocket.Send(encode.GetBytes("ok"));
                DestroySocket(acceptSocket); //import
            }
        }

/// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="host"></param>
        /// <param name="port"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string Send(string host, int port, string data)
        {
            string result = string.Empty;

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(host, port);
            clientSocket.Send(encode.GetBytes(data));
            Console.WriteLine("Send:" + data);
            result = Receive(clientSocket, 5000 * 2); //5*2 seconds timeout.
            Console.WriteLine("Receive:" + result);
            DestroySocket(clientSocket);

return result;
        }

/// <summary>
        /// 接收数据
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        private static string Receive(Socket socket, int timeout)
        {
            string result = string.Empty;

socket.ReceiveTimeout = timeout;
            List<byte> data = new List<byte>();
            byte[] buffer = new byte[1024];
            int length = 0;
            try
            {
                while ((length = socket.Receive(buffer)) > 0)
                {
                    for (int j = 0; j < length; j++)
                    {
                        data.Add(buffer[j]);
                    }
                    if (length < buffer.Length)
                    {
                        break;
                    }
                }
            }
            catch { }
            if (data.Count > 0)
            {
                result = encode.GetString(data.ToArray(), 0, data.Count);
            }

return result;
        }

/// <summary>
        /// 销毁Socket对象
        /// </summary>
        /// <param name="socket"></param>
        private static void DestroySocket(Socket socket)
        {
            if (socket.Connected)
            {
                socket.Shutdown(SocketShutdown.Both);
            }
            socket.Close();
        }
    }
}

发送和接收TCP数据:
SocketTest.Send("127.0.0.1", 8888, "www.111cn.net");]

C/S通信模型与B/S通信模型介绍的更多相关文章

  1. I/O通信模型(BIO,NIO,AIO)

    一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...

  2. I/O模型系列之三:IO通信模型BIO NIO AIO

    一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...

  3. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

  4. Netty 系列之 Netty 高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用 Netty4 + Thrift 压缩二进制编解码技术,他们实现了 10 W TPS(1 K 的复杂 POJO 对象)的跨 ...

  5. Netty系列之Netty高性能之道

    转载自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Ne ...

  6. Netty高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用.相比于 ...

  7. 转:Netty系列之Netty高性能之道

    1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用 ...

  8. (基础篇 走进javaNIO)第二章-NIO入门

    在本章巾,我们会分别对 JDK 的BIO ,NIO 和JDK 1.7 最新提供的 NI02.0的使用进行详细说明 ,通过流程图和代 码讲解,让大 家体会到随着 Ja va 1/0 类库的 不断发展和改 ...

  9. (转)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    原文出自:http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间 ...

随机推荐

  1. lua(wax框架) 适配 64位操作系统

    ======================使wax框架真正兼容64位系统========================== 苹果强制要求所有新提交的应用必须兼容64位,但原来使用lua的框架wax ...

  2. 【Elasticsearch】ES中时间查询报错:Caused by: ElasticsearchParseException[failed to parse date field [Sun Dec 31 16:00:00 UTC 2017] with format [yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis]];

    ES中时间查询报错:Caused by: ElasticsearchParseException[failed to parse date field [Sun Dec 31 16:00:00 UTC ...

  3. Unity中的内存泄漏

    在对内存泄漏有一个基本印象之后,我们再来看一下在特定环境——Unity下的内存泄漏.大家都知道,游戏程序由代码和资源两部分组成,Unity下的内存泄漏也主要分为代码侧的泄漏和资源侧的泄漏,当然,资源侧 ...

  4. 【转】从源码来分析ListView

    原文:http://yanmingming.sinaapp.com/?p=1251 原文其实不叫这个名字,本文对于原文有一定的修改,觉得这个名字比较适合本篇. 一.ListView 的工作原理 Ada ...

  5. 如何用 Java 实现 Web 应用中的定时任务?

    定时任务,是指定一个未来的时间范围执行一定任务的功能.在当前WEB应用中,多数应用都具备任务调度功能,针对不同的语音,不同的操作系统, 都有其自己的语法及解决方案,windows操作系统把它叫做任务计 ...

  6. C#程序集Assembly学习随笔(增补版,附图)_AX

    上篇我讲了下我对Assembly的初步认知.现在来说说怎么使用已有的Assembly.比如说我在做一个解决方案时,发现你做的解决方案的某个项目中的类的方法(功能)我正好可以用到,哈,那我就不用写类了, ...

  7. [转]php的public、protected、private三种访问控制模式的区别

    FROM : http://blog.163.com/weiwenjuan_bj/blog/static/14035033620129304183850/?suggestedreading publi ...

  8. Chrome浏览器导出pdf时,隐藏链接HREF

    在使用chrome打印pdf是,会出现链接的HREF也同时打印的情况,只要加一句CSS即可 @media print {   a[href]:after {     content: none !im ...

  9. 启明星会议室系统与Office365集成说明

    在本文,我们将介绍如何配置Office365,以便改系统能够支持启明星会议室预定系统. In this article, we will introduct how to config microso ...

  10. IIS(互联网信息服务)

    ylbtech-Miscellaneos:IIS(互联网信息服务) IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行Micros ...