基础概念

Socket,套接字,本质是网络编程接口、提供网络通信的能力,实现不同虚拟机或不同计算机之间的通信。面向客户/服务(C/S)模型,socket是应用层和传输层之间的中间软件抽象层:

  • 顶上三层处理具体网络应用的所有细节、但对通信细节了解很少,底下四层对具体网络应用了解不多、但处理所有的通信细节(发送数据、等待确认、计算并校正校验等);
  • 顶上三层通常构成所谓的用户进程,底下四层通常提供作为操作系统内核的一部分,用户进程操作的是应用层,内核操作的是传输层及传输层一下的协议;

在网络中进程通信无处不在,socket通信的前提是唯一表示网络中的一个进程:

  • 本地进程唯一表示:ProcessID
  • 网络进程唯一表示:IP地址+协议+端口号(三元组)
    • IP地址(IP层):唯一表示主机;
    • 协议和端口号(TCP层):唯一表示主机中的一个进程;

网络通信连接至少要一对socket,socket之间的通信过程可以分为三个步骤:

  • 服务器监听;
  • 客户端请求;
  • 连接确认;

“一切皆Socket”(Socket起源于Unix,Unix/Linux基本哲学之一就是“一切皆文件”),Socket是"打开—读/写—关闭"模式的实现。

Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket、我们才能使用TCP/IP协议。

  • TCP:传输层协议、基于网络层的IP协议,解决数据如何在网络中传输;
  • HTTP:应用层协议、基于传输层的TCP协议,解决如何包装数据;

HTTP是轿车,提供封装或显示数据的具体形式;Socket是发动机,提供网络通信的能力。

在Socket编程中,经常会遇到同步、异步、阻塞和非阻塞,具体概念参见:谈I/O模型 - sqh;

参考

TCP编程

TCP编程流程图如下(三次握手 + 四次挥手)

服务端

(1)编程步骤

  • 创建一个监听Socket,绑定到一个IP地址和一个端口;
  • 新建一个监听线程,(通过一个无限循环)开始监听等待连接请求;
  • 监听到并接受连接请求,再创建一个该连接上的新的接收Socket;
  • 为该连接新建一个工作线程,接收Socket(通过一个无限循环)与客户端Socket进行通信;
  • 返回,监听等待其他的客户端连接请求;
  • 关闭Socket;

(2)池管理

  • Buffer池:集中管控Socket缓冲区,防止内存碎片
  • SAEA池:集中管控Socket,重复利用Socket
  • Thread池:集中管控和调度工作线程
  • SQL池:分离网络服务层与数据访问层(SQL的执行效率远:低于网络层执行效率)

(3)同步Socket使用场景:同步Socket+Thread

  • 客户端数量比较少(<50);
  • 客户端数量较多但都是短连接:客户端的连接在处理完一次收发之后就断开;

客户端

(1)编程步骤

  • 创建Socket;
  • 向服务器发出连接请求;
  • 和服务器端进行通信;
  • 关闭Socket;

UDP编程

服务端

  • 创建socket;
  • 将socket绑定到一个本地地址和端口上;
  • 等待接收数据;
  • 关闭socket;

客户端

  • 创建socket;
  • 向服务器发送数据;
  • 关闭socket;

HTTP编程


Socket编程应用

Socket初识的更多相关文章

  1. python ---socket初识

    python网络编程(初识) 一些概念 套接字: 套接字(socket)也叫通信端点,最初用于计算机内部进程之间的通信,而随着网络的发展,套接字被用于计算机之间的通信.举个例子,你(是一台计算机)要打 ...

  2. Python自动化之socket初识

    1. os.popen() os.system(cmd)会直接输出命令的结果到屏幕上,返回一个状态码0或1. os.popen(cmd)会返回一个<open file 'dir', mode ' ...

  3. python学习之路网络编程篇(第一篇)socket初识

    什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为socket.socket通常也称为“套接字”,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的 ...

  4. Socket 初识 用Socket建立一个简易Web服务器

    摘自<Asp.Net 本质论>作者:郝冠军 //在.Net中.system.Net命名空间提供了网络编程的大多数数据据类型以及常用操作,其中常用的类型如下: /* IPAddress 类表 ...

  5. Socket初识2

    一.Socket一些概念 sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 1.1 参数1:Socket Families(地址簇) / ...

  6. TCP/IP,HTTP,Socket初识

    在大学时候学过网络通信这一块,奈何已经还给老师,苍天饶过谁,该拾起来看看学学的还是要学,先简单了解了下这方面的知识,后续会继续通过看书来充实这方面的知识. 手机能够联网是手机底层实现了TCP/IP协议 ...

  7. python学习之路---day25( 网络编程基础和初识socket)

    基本网络知识和初识socket一:基本知识 网线:传输电信号 集线器:将所有连接到集线器的网络设备连通起来 交换机: 升级版的集线器 网卡:接受电信号 MAC地址:物理地址: 8C-88-4B-88- ...

  8. socket编程相关阐述

    一.socket初识 ①服务端 import socket server = socket.socket() server.bind(('127.0.0.1', 8080)) server.liste ...

  9. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

随机推荐

  1. IE8/9 JQuery.Ajax 上传文件无效

    IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...

  2. scp报错 -bash: scp: command not found

    环境:RHEL6.5 使用scp命令报错: [root@oradb23 media]# scp /etc/hosts oradb24:/etc/ -bash: scp: command not fou ...

  3. 基于DFA敏感词查询的算法简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直 ...

  4. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  5. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  6. 编写自己的PHP MVC框架笔记

    1.MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). ...

  7. [jquery]显示隐藏div标签的几种方法

    1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...

  8. osi(open system interconnection)模型的通俗理解

    OSI模型的理解: 以你和你女朋友以书信的方式进行通信为例. 1.物理层:运输工具,比如火车.汽车. 2.数据链路层:相当于货物核对单,表明里面有些什么东西,接受的时候确认一下是否正确(CRC检验). ...

  9. Disque:Redis之父新开源的分布式内存作业队列

    Disque是Redis之父Salvatore Sanfilippo新开源的一个分布式内存消息代理.它适应于"Redis作为作业队列"的场景,但采用了一种专用.独立.可扩展且具有容 ...

  10. Java下好用的开源库推荐

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...