socket编程初识
一、socket
1、socket层
2、socket的理解
写python代码的时候socket就像是一个模块,通过import导入,通过调用模块中的方法建立两个进程之间的连接和通信。
Socket是应用层与传输层通信的中间软件抽象层,它是一组接口。它是为了帮我们简化两个进程之间通信的步骤,
使用Socket不需要我们很了解网络层、数据链路层等底层的工作原理,Socket已经帮我们把那些复杂的通信过程封装好了,
我们直接去使用就行了 3、套接字(socket)的发展史
套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。
一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。
套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。 基于文件类型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信 基于网络类型的套接字家族
套接字家族的名字:AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,
所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET) 4、基于tcp/udp的socket
TCP:可靠的、面向连接的协议、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。 UDP:不可靠的、无连接的服务,传输效率高,一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
5、小例子
5-1、tcp协议的socket
对于TCP协议的socket server来说
不能同时接受多个client端的连接
# 服务端
import socket # 导入socket
tcp_sk = socket.socket() # 实例化一个服务器对象
tcp_sk.bind(('127.0.0.1',8080)) # 服务器绑定一个IP地址和端口
tcp_sk.listen() # 监听连接 # conn可以理解为在服务端中与客户端进行交互的操作符(对象)
# addr是客户端的IP地址和端口
conn,addr = tcp_sk.accept() # 接受客户端链接,此时如果没有客户端连接过来,服务器会在此等候,不会向下走(阻塞) while True:
se_msg = input('>>>:')
conn.send(se_msg.encode('utf-8')) # send发送的内容必须是bytes类型
re_msg = conn.recv(1024) # recv接收客户端发送过来的内容,1024是接收的字节长度
print(re_msg.decode('utf-8'))
conn.close() # 关闭与客户端的连接 tcp_sk.close() # 关闭服务器
# 注意:一般情况下服务器是不会关闭的,会一直为用户提供服务。 # 客户端
import socket
sk = socket.socket() # 实例化一个客户端对象
sk.connect(('127.0.0.1',8080)) # 连接服务端的IP和端口
while True:
re_msg = sk.recv(1024)
print(re_msg.decode('utf-8'))
se_msg = input('>>>:')
sk.send(se_msg.encode('utf-8'))
sk.close() # 关闭客户端
注意:服务器和客户端的send,recv是一一对应的,也就是说,服务器send一次,客户端就需要recv一次,
客户端send一次,服务端也要recv一次。
客户端只需要连接上服务器就可以了,客户端的IP就是自己的IP,但是端口是由操作系统随机分配的。
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
还有的时候会遇到这种错误情况:
错误的意思是说你这个端口被占用了,引发的原因可能是因为,你运行服务端后直接按pycharm的强制退出键,导致操作系统并没有
第一时间知道你已经结束了这个程序,如果不急用这个端口的话,你可以等上几分钟,操作系统会反应过来你已经不需要这个程序了,
会自动帮你释放这个端口,或者你可以改一个端口使用,如果你很任性,你就要立刻马上使用这个端口,那么可以这样:
在bind之前加入一条socket配置,重用ip和端口
tcp_sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 就是这个东西
tcp_sk.bind(('127.0.0.1',8080)) 可退出的:
服务端:
import socket
sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind(('127.0.0.1',8085))
sk.listen() while True:
conn,addr = sk.accept()
while True:
se_msg = input('>>>:')
conn.send(se_msg.encode('utf-8'))
if se_msg == 'q':
break
re_msg = conn.recv(1024)
if re_msg == b'q':
break
print(re_msg.decode('utf-8'))
conn.close()
sk.close 客户端:
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8085))
while True:
re_msg = sk.recv(1024)
if re_msg == b'q':
break
print(re_msg.decode('utf-8'))
se_msg = input('>>>:')
sk.send(se_msg.encode('utf-8'))
if se_msg == 'q':
break
sk.close() 5-2、udp的socket
server端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) # 设置type使其成为udp类型的socket
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind(('127.0.0.1',8005)) # 绑定IP和端口 msg,addr = sk.recvfrom(1024) # 接收信息和对方IP print(msg.decode('utf-8'))
print(addr) sk.sendto('你好'.encode('utf-8'),addr) # 发送信息给对方 sk.close() client端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto('hello'.encode('utf-8'),('127.0.0.1',8005))
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
print(addr)
sk.close() 注意:udp支持多个客户端同时与服务端交互,
但是开始发送消息的一方肯定是客户端,因为客户端不传送消息给服务端,服务端是
不知道客户端的IP的,是无法通信的,所以要通信,只能客户端先发起请求。 循环模式:
服务端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM) # 设置type使其成为udp类型的socket
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind(('127.0.0.1',8005)) # 绑定IP和端口 while True:
msg,addr = sk.recvfrom(1024) # 接收信息和对方IP
print(addr,msg.decode('utf-8'))
msg_send = input('>>>:')
sk.sendto(msg_send.encode('utf-8'),addr) # 发送信息给对方 sk.close() 客户端:
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
while True:
msg_send = input('>>>:')
sk.sendto(msg_send.encode('utf-8'),('127.0.0.1',8005))
msg,addr = sk.recvfrom(1024)
print(addr,msg.decode('utf-8'))
sk.close() 6、socket参数详解
family | 地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域实际上是使用本地 socket 文件来通信) |
type | 套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 SOCK_DGRAM 是基于UDP的,无保障的面向消息的socket,多用于在网络上发广播信息。 |
proto | 协议号通常为零,可以省略,或者在地址族为AF_CAN的情况下,协议应为CAN_RAW或CAN_BCM之一。 |
fileno | 如果指定了fileno,则其他参数将被忽略,导致带有指定文件描述符的套接字返回。 与socket.fromfd()不同,fileno将返回相同的套接字,而不是重复的。 这可能有助于使用socket.close()关闭一个独立的插座。 |
二、软件开发的架构
1、C/S架构:server client
Client与Server就是客户端与服务器端的意思,这里的客户端通常指的是我们的应用程序
2、B/S架构
Browser与Server就是浏览器端与服务器端架构,Browser指的是浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,
只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。
3、b/s的趋势
随着我们要安装的应用程序越来越多,我们就会感觉很麻烦,如果能像浏览器一样,只打开浏览器就可以访问各种资源,那么久方便很多了,
所以手机端也是向着b/s方向发展的(微信小程序就是一个很好的例子,只要打开微信,在微信搜索需要的应用即可,不需要额外打开其他程序) pc端
浏览器
统一了程序的入口
手机端
微信小程序
统一了程序的入口
socket编程初识的更多相关文章
- day07 类的进阶,socket编程初识
类的静态方法: 正常: 添加静态方法: 就会变成一个函数,不会自动传self 参数,不会调用类的变量和实例的变量 不在需要self 名义上归类管,但是它就是一个单独的函数,不在需要传入self,想怎 ...
- C# Socket编程(4)初识Socket和数据流
经过前面基础知识作为背景,现在对Socket编程进行进一步的学习.在System.Net.Socket命名空间提供了Socket类,利用该类我们可以直接编写Socket的客户端和服务的的程序.但是直接 ...
- 2018.12.02 Socket编程之初识Socket
Socket编程主要分为TCP/UDP/SCTP三种,每一种都有各自的优点,所以会根据实际情况决定选用何种Socket,今天开始我将会逐步学习Socket编程,并将学习过程记录于此. 今天学习的是TC ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
- 27_网络编程-初识socket
一.C/S B/S 架构 1.定义 (1)C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Cl ...
- 【转】C# Socket编程(4)初识Socket和数据流
[转自:https://www.cnblogs.com/IPrograming/archive/2012/10/15/CSharp_Socket_4.html] 经过前面基础知识作为背景,现在对Soc ...
- python进阶---Python中的socket编程
初识socket编程 一.前言 socket基于C\S架构(客户端\服务端)的编程模型,在Python中是以socket模块存在的. Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是 ...
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
随机推荐
- vue中computed计算属性与methods对象中的this指针
this 指针问题 methods与computed中的this指针 应该指向的是它们自己,可是为什么this指针却可以访问data对象中的成员呢? 因为new Vue对象实例化后data中的成员和c ...
- Laravel Excel 实现 Excel-CSV 文件导入导出功能
Laravel Excel 是一款基于 PHPExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便. 它的 Github 地址是:https:// ...
- 左侧固定,右侧自适应的布局方式理解margin负值理论
一.浮动布局 1.先让固定宽度的div浮动!使其脱离文档流.2.margin-left的值等于固定div的宽度相等. .aside{ float: left; width: 200px; backgr ...
- 轻量级应用程序Dynamics 365 App for Outlook介绍
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复273或者20180625可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...
- arcgis api 3.x for js 入门开发系列十二地图打印GP服务(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 你真的了解PeopleSoft中的function和method方法嘛
谈下function和method在内嵌与外部传参的区别 1.内嵌函数(Internal Functions) 看下现在输出&x的话会返回什么值? 2.内嵌函数(Internal Functi ...
- UDK命令
UDK命令行参数与控制台命令都是大小写不敏感的 命令行 udn中文 udn英文 全词大小写匹配,正则表达式,在c++代码中搜索减号开头的命令行参数(如:-BENCHMARK.-onethread等 ...
- 挖一挖MongoDB的备份与还原(实现指定时间点还原和增量备份还原)
一 研究背景需求 目前作者所在公司的MongoDB数据库是每天凌晨做一次全库完整备份,但数据库出现故障时,只能保证恢复到全备时间点,比如,00:30 做的完整备份,而出现故障是下午18:00,那么现 ...
- windows10 1903 64位系统
近日,微软完成并开始推送Windows 10 2019年的第一个重大升级的预览版本,版本号是v1903,命名则是2019年5月更新版. 点击下载windows10
- (转载)最完整的自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件
今天笔者就要归纳总结下一整套测试流程,从无到有,实现零突破,包括如何编写测试用例,定时执行测试用例,查找最新生成的测试报告文件,自动发送最新测试报告邮件,一整套完整的测试流程.以后各位只要着重如何编写 ...