Socket(套接字)通信{网络通信其实就是Socket间的通信},首先了解下概念:【来源于百度百科】

"两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。"

可以这么说,Socket就是一个网络编程的接口(API),它定义了一种标准,并对TCP/IP进行封装,实现了网络传输数据的能力。

这篇文章默认您已经了解IP、端口等基本网络概念,如未了解,请移步:https://baike.baidu.com/item/IP/224599

我们想象这么一个场景,如果两个人,想要互相送一份礼物【用某风快递】,那么每个人都需要知道对方的什么信息?

  1. 地址【IP】:不然你让快递公司送到哪里?【不然你让互联网提供商把数据送到哪台电脑?】
  2. 姓名【端口】:一个地点不一定住一个人啊,快递小哥怎么知道要送给谁?【一台电脑不一定只有一个程序使用网络啊,系统怎么知道把数据传给哪个程序?】

再一点,快递公司有很多种,不一定非得选择某风快递,你也可以用某通快递、某达快递、某国邮政之类的,各有各的特点。在socket通信中也是这样,分为TCP、UDP两种。

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!

关键词我已经标记出来了,配合上面的情景引入,可以很容易的理解。既然各有各的特色,那么根据生物学定理:“结构决定功能”,我们也很容易知道这俩东西肯定有不一样的地方。

TCP,由于是基于双方连接的情况下传输的,因此它的连接以及数据传输是非常稳定可靠的,可以使一台计算机发出的字节流完好无损的发生给另一台计算机。对要求可靠性非常高的应用程序会选择此种通信方式。

UDP,肯定是不太稳定的了,它适用于一次只传送少量数据、对可靠性要求不高的应用环境。其实我们常常使用的【ping】命令的工作原理就是向对方主机发送ICMP数据包【自行百度】,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。对了,QQ的聊天功能大部分是用UDP来实现的,因为这样可以使得传输速率极快,但同时也会出现发生失败的情况,更极端的就是遇到掉包的情况。

另外,关于Socket通信还需理解的两对概念:长连接与短连接异步与同步【这个概念理解起来较难,但你可以先不理解,不会妨碍你实现小项目,在你实现完几个小项目后,再反过来看这块,你会有恍然大悟的感觉】

1、长连接 
       顾名思义,长连接就是连接时间更长的连接方式:连接——>传输数据——>等待——>传输数据…………——>结束
       Socket无论在是否使用都处于连接状态,虽然占用资源更小,但安全性较差。

2、短连接
        同样也是顾名思义,短连接就是连接时间更短的连接方式,但会多次连接:连接——>传输数据——>结束  连接——>传输数据…………——>结束
       SOCKET连接后发送后接收完数据后马上断开连接。

1、异步 
       报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况: 
       (1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收 
       (2)异步单工:接收和发送是用两个不同的程序来完成。

2、同步 
       报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。
       在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

原谅我,同步异步实在没找到合适的图,我也实在想不出怎么来举栗子能让读者更好的理解。我个人经历是:做了个评测机【评测机和网站服务器间用socket传输数据】后才理解的。

下面我们就得了解这些快递公司到底如何实现交互的?

先看这个图,其实这个图就可以概括一切了,但是为了让大部分更好的理解,我再解释下的。

首先,客户端和服务端会分别新建一个socket,服务端的socket需要通过bind()来绑定上端口,启动listen()进行实时监听,并等待客户端的接入,即accept()。而客户端则需要通过服务器IP和端口两个参数来建立connect()连接,此时,服务器会得到有新客户端连接的信息,启动read()等待客户端数据的传人,客户端如果成功接收到服务端的连接成功后,继续执行write()来向服务端发生数据,同理,服务端也使用这样的模式回馈客户端的数据,知道客户端关闭,服务端会收到客户端退出连接的消息,服务器重新进入等待状态,等待新客户端的进入。

下面是用python写的示例,其他语言也都遵循上面的标准,C++采用的扩展库来实现的,在<WINSOCKET2>这个库中实现。

 import socket
#服务端
new_socket = socket.socket() # 创建 socket 对象
ip = "127.0.0.1" # 获取本地主机名
port = 52052 # 设置端口
new_socket.bind((ip, port)) # 绑定端口
new_socket.listen(5) # 等待客户端连接并设置最大连接数
while True:
new_cil, addr = new_socket.accept() # 建立客户端连接。
print('新进来的客户端的地址:', addr)
print(new_cil.recv().decode())
new_cil.send('答案为6')
new_cil.close() # 关闭连接
import socket
#客户端
ip = "127.0.0.1"
port = 52052
new_socket = socket.socket()  #创建socket对象
new_socket.connect((ip,port))  #连接
new_socket.send("请求给我计算下1+5=多少?".encode(encoding='utf-8')) #发生数据
print("客户端发给服务端:请求给我计算下1+5=多少?")
back_str = new_socket.recv().decode() #结束数据
print("服务端发给客户端:"+back_str)
new_socket.close() #关闭客户端
print("客户端结束运行")

人生苦短,我用python!隔壁C语言实现这个至少200行代码!

【Socket通信】关于Socket通信原理解析及python实现的更多相关文章

  1. 【python原理解析】python中分片的实现原理及使用技巧

    首先:说明什么是序列? 序列中的每一个元素都会被分配一个序号,即元素的位置,也称为索引:在python中的序列包含:字符串.列表和元组 然后是:什么是分片? 分片就是通过操作索引访问及获得序列的一个或 ...

  2. socket系列之socket服务端与客户端如何通信

    上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...

  3. C#版清晰易懂TCP通信原理解析(附demo)

    [转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...

  4. 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版

    目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...

  5. 阻塞通信之Socket编程

    Socket通信,主要是基于TCP协议的通信.本文从Socket通信(代码实现).多线程并发.以及TCP协议相关原理方面 介绍 阻塞Socket通信一些知识. 本文从服务器端的视角,以“Echo Se ...

  6. Socket 两平台互相 通信 .NET

    两个平台互相通信,对方发送数据过来,我方接收数据,对数据进行处理后发送结果给对方,对方进行相应的操作. 首页,我方开启服务监听: Socket socket = new Socket(AddressF ...

  7. UE4 Socket多线程非阻塞通信

    转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...

  8. CPP-网络/通信:SOCKET

    客户端实现代码: //引入头文件 #include <WinSock2.h> //客户端创建Socket////////////////////////////////////////// ...

  9. C#的Socket实现UDP协议通信

    今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...

随机推荐

  1. webpack搭建环境步骤

    一.初始化 1.创建文件夹 2.npm init  -y 二.安装webpack 和webpack-cli 1.yarn add webpack webpack-cli@3.3.10 -D (这里指定 ...

  2. window下用notepad++编辑了脚本文件然后放在linux报错显示无法运行

    首先vi :set ff 查看文件类型 接着 下载dos2unix  root用户下yum -y install dos2unix 然后 dos2unix 文件.sh 转换格式  接着在正常启动即可

  3. 【Spark】RDD的依赖关系和缓存相关知识点

    文章目录 RDD的依赖关系 宽依赖 窄依赖 血统 RDD缓存 概述 缓存方式 RDD的依赖关系 RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖(narrow dependency) 和宽依赖 ...

  4. OpenCV 经纬法将鱼眼图像展开

    文章目录 前言 理论部分 鱼眼展开流程 鱼眼标准坐标计算 标准坐标系与球坐标的转换 代码实现 测试效果如下图 总结 this demo on github 前言 鱼眼镜头相比传统的镜头,视角更广,采集 ...

  5. python--递归函数的学习

    递归:函数间接或者直接调用自己 递归分两个过程 1.往下调用,分解的过程 2.往上回溯,综合的过程 递归的条件: 一定要有结束的条件 例子:阶乘: def fun_a(n): #print(n) if ...

  6. Gradle 多环境URL请求设置

    在开发过程中,多环境配置是经常遇到的,比如在Android开发过程中,在不同环境上请求服务器的URL是不同的,使用Gradle进行管理,是非常方便的. 首先查看工程目录结构: 使用AndroidStu ...

  7. vue 路由钩子。

    一.全局钩子 你可以使用 router.beforeEach 注册一个全局的 before 钩子: const router = new VueRouter({ ... }) router.befor ...

  8. Rabbit的字符串 字符串最小表示法

    Rabbit的字符串 #include<bits/stdc++.h> using namespace std; ; char s[maxn]; int get_min_pos() { , ...

  9. js 文本框只能输入数字和点

    http://www.jb51.net/article/51102.htm 手机端 只能输入数字,能输小数点.且只能2位小数 oninput="this.value=this.value.r ...

  10. E. Alternating Tree 树点分治|树形DP

    题意:给你一颗树,然后这颗树有n*n条路径,a->b和b->a算是一条,然后路径的权值是 vi*(-1)^(i+1)  注意是点有权值. 从上头往下考虑是点分治,从下向上考虑就是树形DP, ...