1.简介本来打算再写一篇这个系列的文章也要和小伙伴或者童鞋们说再见了,可是有人留言问WebSocket包和小程序的包不会抓,那就关于这两个知识点宏哥就再水两篇文章 。
2.什么是Socket?在计算机通信领域,socket 被翻译为“套接字”(套接字=主机+端口号) , 它是计算机之间进行通信的一种约定或一种方式 。通过 socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read关闭close”模式来操作 。
我的理解就是Socket就是该模式的一个实现,它只是提供了一个针对TCP或者UDP编程的接口:即socket是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭) 。
socket抽象层在网络中的位置图解,如下图所示:
文章插图
3.Socket通信流程Socket通信流程,如下图所示:
文章插图
根据socket通信基本流程图,总结通信的基本步骤:
服务器端:
第一步:创建一个用于监听连接的Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Bind()方法绑定EndPoint;
第四步:用socket对像的Listen()方法开始监听;
第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;
第六步:通信结束后一定记得关闭socket;
客户端:
第一步:建立一个Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数 , 向服务器发出连接请求;
第四步:如果连接成功 , 就用socket对像的Send()方法向服务器发送信息;
第五步:用socket对像的Receive()方法接受服务器发来的信息 ;
第六步:通信结束后一定记得关闭socket;
4.python实现一个客户端与服务端的通信4.1函数Socket对象方法:服务端:
函数描述.bind()绑定地址关键字,AF_INET下以元组的形式表示地址 。常用bind((host,port)).listen()监听TCP,可以挂起的最大连接数,该值至少为1,一般设为5即可.accept()被动接受TCP客户端的连接客户端: 函数描述.connect()初始化服务器连接.connect_ex()是对connect()函数的扩展,当出错时返回出错码,不报异常其它函数: 函数描述.recv()接收数据,数据以字符串的形式返回,bufsize指定接收的最大数据量 。.send()发送数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数量,通常使用.encode()函数对数据进行转码.senddall()发送完整的数据,在返回之前会尝试发送所有数据,成功返回None,失败则抛出异常 。.recvfrom()与recv()函数类似,不同的是返回值是(data,address),其中data是包含接收数据的字符串,address是发送数据的套接字地址 。.sendto()发送UDP数据 , 将数据发送到套接字,形式是(ipaddr,port)的元组 。.close()关闭套接字4.2服务端使用socket函数来创建一个socket对象,并设置一个socket服务,然后通过bind(hostname,port)函数来指定一个端口,使用socket对象的accept方法,等待客户端的连接,并返回connection对象 。具体步骤为:
#创建服务端套接字serversocket=socket()#把地址绑定到套接字serversocket.bind()#对连接进行监听serversocket.listen()#使用一个while进行循环,并接收客户端的连接while True:serverclient=serversocket.accept()while True:#接收已发送serverclient.recv()serverclient.send()#关闭客户端套接字serverclient.close()#关闭服务端套接字serversocket.close()4.3具体代码实现实现功能:通过while实现循环接收客户端发送的数据,并对客户端发送的数据进行显示并返回给客户端数据,返回给客户端的数据信息后加入时间戳 。新建一个文件server.py 。
import socketimport sysimport timeserversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=socket.gethostname()#获取本地主机名port=9999#绑定端口号serversocket.bind((host,port))#设置最大连接数serversocket.listen(5)while True:print('服务器启动,监听客户端链接')clientsocket,addr=serversocket.accept()print('链接地址:%s' % str(addr))while True:try:data=https://www.huyubaike.com/biancheng/clientsocket.recv(1024)except Exception:print('断开的客户端:',addr)breakprint('客户端发送内容:',data.decode('utf-8'))reply=input('回复:').strip()if not reply:breakmsg=time.strftime('%Y-%m-%d %X')#获取结构化时间戳msg1='[%s]:%s'% (msg,reply)clientsocket.send(msg1.encode('utf-8'))clientsocket.close()serversocket.close()
推荐阅读
- 《火影忍者》:二代火影真正的死因是什么为什么说是不会解开的迷题
- JVM运行时数据区域详解
- 《火影忍者》里,二代火影是怎么死的(二代火影为什么打不过金银角)
- 《火影忍者》中一代和二代火影是怎么死的(火影忍者几代火影之死)
- 怎样在《红警》里联机(红警2怎么两个人联机)
- DNF轻松赚金币的方法有哪些海外如何低延迟玩《地下城与勇士》
- 《ASP.NET Core技术内幕与项目实战》精简集-目录
- 安卓版经典galgame打包下载,跪求《安卓galgame经典合集》
- 谣言检测《Rumor Detection with Self-supervised Learning on Texts and Social Graph》
- 《英雄联盟》游戏中“烬”的大招怎么放(英雄联盟烬开大怎么取消)