【Socket通信】关于Socket通信原理解析及python实现
Socket(套接字)通信{网络通信其实就是Socket间的通信},首先了解下概念:【来源于百度百科】
"两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。"
可以这么说,Socket就是一个网络编程的接口(API),它定义了一种标准,并对TCP/IP进行封装,实现了网络传输数据的能力。
这篇文章默认您已经了解IP、端口等基本网络概念,如未了解,请移步:https://baike.baidu.com/item/IP/224599
我们想象这么一个场景,如果两个人,想要互相送一份礼物【用某风快递】,那么每个人都需要知道对方的什么信息?
- 地址【IP】:不然你让快递公司送到哪里?【不然你让互联网提供商把数据送到哪台电脑?】
- 姓名【端口】:一个地点不一定住一个人啊,快递小哥怎么知道要送给谁?【一台电脑不一定只有一个程序使用网络啊,系统怎么知道把数据传给哪个程序?】
再一点,快递公司有很多种,不一定非得选择某风快递,你也可以用某通快递、某达快递、某国邮政之类的,各有各的特点。在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实现的更多相关文章
- 【python原理解析】python中分片的实现原理及使用技巧
首先:说明什么是序列? 序列中的每一个元素都会被分配一个序号,即元素的位置,也称为索引:在python中的序列包含:字符串.列表和元组 然后是:什么是分片? 分片就是通过操作索引访问及获得序列的一个或 ...
- socket系列之socket服务端与客户端如何通信
上面已经分别介绍了ServerSocket跟Socket的工作步骤,并且从应用层往系统底层剖析其运作原理,我们清楚了他们各自的一块,现在我们将把他们结合起来,看看他们是如何通信的,并详细讨论一下他们之 ...
- C#版清晰易懂TCP通信原理解析(附demo)
[转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...
- 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版
目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...
- 阻塞通信之Socket编程
Socket通信,主要是基于TCP协议的通信.本文从Socket通信(代码实现).多线程并发.以及TCP协议相关原理方面 介绍 阻塞Socket通信一些知识. 本文从服务器端的视角,以“Echo Se ...
- Socket 两平台互相 通信 .NET
两个平台互相通信,对方发送数据过来,我方接收数据,对数据进行处理后发送结果给对方,对方进行相应的操作. 首页,我方开启服务监听: Socket socket = new Socket(AddressF ...
- UE4 Socket多线程非阻塞通信
转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...
- CPP-网络/通信:SOCKET
客户端实现代码: //引入头文件 #include <WinSock2.h> //客户端创建Socket////////////////////////////////////////// ...
- C#的Socket实现UDP协议通信
今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...
随机推荐
- I - Coins dp
http://acm.hdu.edu.cn/showproblem.php?pid=2844 这个题目是一个多重背包转化成01背包 题意: Whuacmers拥有bi个面值为ai的硬币,现在他要用这些 ...
- CC2530定时器
一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设. 定时/计数 ...
- spark是怎么从RDD升级到DataFrame的?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第五篇,我们来看看DataFrame. 用过Python做过机器学习的同学对Python当中pandas当中的Data ...
- [UVA Live 12931 Common Area]扫描线
题意:判断两个多边形是否有面积大于0的公共部分 思路:扫描线基础. #pragma comment(linker, "/STACK:10240000") #include < ...
- HDU 2001 (水)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2001 题目大意:两个点求距离 解题思路: 套基本公式 a = √(b2 + c2); 小数点后几位的表 ...
- 前端:参数传错了,spring-boot:那错误信息我给你显示的友好点儿
之前两篇文章 Spring-boot自定义参数校验注解和如何在spring-boot中进行参数校验,我们介绍了,参数校验以及如何自定义参数校验注解,但是当传递参数出错时,只是把错误信息打印到了控制台, ...
- Ubuntu+uWSGI部署Django项目【鸿篇巨制,事无巨细】
背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...
- 从`ArrayList`中了解Java的迭代器
目录 什么是迭代器 迭代器的设计意义 ArrayList对迭代器的实现 增强for循环和迭代器 参考链接 什么是迭代器 Java中的迭代器--Iterator是一个位于java.util包下的接口,这 ...
- 2020网鼎杯 白虎组reverse:hero
主函数,当bossexist的值不为0时,while循环dround()函数,循环结束输出flag outflag()函数的flag值由6段数据拼凑而成 while循环的dround()函数有三个选择 ...
- 仅需60秒,使用k3sup快速部署高可用K3s集群
作者简介 Dmitriy Akulov,连续创业者,16岁时搭建了开源CDN公共服务jsDelivr的v1版本.目前是边缘托管平台appfleet创始人. 原文链接: https://ma.ttias ...