所谓套接字,其实就是socket
socket是干嘛用的呢?
当我们写一个C/S架构的软件时,是需要实现客户端与服务端之间的网络通信的,不然你的客户端怎么和服务端建立连接呢?这个socket就是负责干这个事的。
还记得OSI七层协议吗?如果是计算机科班出身的同学一定学过这个,没关系,哥带你回顾下到底什么是OSI七层协议以及这玩意有什么鸟用。
OSI七层协议(从上往下,注意数据传输时也是从应用层开始往下封包):
7.应用层 -- 567三层可以合并当作全部属于应用层,这里就是应用程序,比如QQ、微信等
6.表示层
5.会话层
4.传输层 -- TCP/UDP端口
3.网络层 -- IP地址
2.数据链路层 -- 把信号转换成二进制数0101....
1.物理层 -- 这是最底层,例如网线、光纤
那么我为什么要帮你回顾OSI七层协议呢?
这里就要引出socket的作用了,如果没有这个socket,那么我们在做网络编程时就要先搞清楚TCP/UDP的相关内容,而这部分内容极其庞杂,以我的聪明才智都搞不定,你觉得你可以?呵呵。所以你看看人家python多么厚道,人知道你搞不定,所以给你来个socket直接封装了传输层和网络层,我们在进行网络编程的时候只需要调用socket的接口函数就行了。
直接来个示例,让你见识下socket的牛逼之处。
下面我写个C/S结构的简单代码,模拟下打电话的过程,教你如何进行socket编程。
用生活中的打电话的例子来说明socket编程的步骤:
第一步:买个手机
第二步:绑定个手机卡
第三步:开机
第四步:等待一个电话连接进来
第五步:接收消息
第六步:回复消息
第七步:挂电话
第八步:关机
好了,根据上面这个思路,开始写代码:
**服务端代码:**
import socket
#实例化一个对象ipone,其中AF_INET代表基于网络类型的套接字,SOCK_STREAM代表TCP协议。
ipone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定本机的IP地址和端口,注意IP和端口是放在元组中。
ipone.bind(('127.0.0.1',8080))
#listen(5)表示一个backlog<半链接池>中,意思就是允许5个客户端连接同时进来,就像手机可以同时进来两个电话
# 此处可根据实际调整数字大小
#backlog的作用很大,比如SYN洪水攻击的时候,就可以通过调大backlog的数字来预防。
ipone.listen(5)
#等待客户端发送消息,此处会等待客户端发送消息后才会往下运行程序。
conn,addr=ipone.accept()
#接收消息并赋值给变量msg,其中1024代表最大允许接收1024字节的内容。
msg=conn.recv(1024)
print('客户端发来的消息内容是:',msg)
#发送消息给客户端
conn.send(msg.upper())
#关闭conn连接
conn.close()
#关闭socket
ipone.close()
**客户端代码:**
import socket
ipone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ipone.connect(('127.0.0.1',8080))
#把字符串转换成utf-8类型的二进制数据,客户端和服务端通信从底层来说就是传输的二进制数据。
ipone.send('hello'.encode('utf-8'))
data=ipone.recv(1024)
print('服务端发送过来的消息内容是:',data)
标签:socket,--,编程,ipone,conn,接字,服务端,客户端
From: https://www.cnblogs.com/kkbest/p/18342186