socket
今天我们来学习新内容 实现网络通信的socket 。
讲之前先问大家一个问题,大家平时的都用什么聊天? QQ 对不对。
你在和朋友用qq聊天的时候就用到了我们今天要讲的socket。
你在和朋友聊天的时候是怎么做的?登陆qq,收发消息,最后退出qq。
这是我们聊天的过程。你的朋友要和你聊天,他的聊天过程和你也一样。
1. 登陆qq
2. 收发消息
3. 退出qq
那大家想一下,登陆qq是不是先让你和你朋友连接上?连接上之后,你就可以可朋友收发消息了。
那你和朋友怎么连接上呢?
我们之前学过网络原理
我们知道 IP地址 可以唯一标识网络中的电脑,端口和协议 可以唯一标识电脑中的程序,
那三者结合起来,我们是不是就可以找到指定电脑上的指定程序,将两台电脑上的程序连接起来。
好,现在我把 IP+端口+协议 组成一个整体。
这个整体是什么呢? 就是我们前面说到的socket。
我们看一下我们在用qq聊天的过程中socket都做了什么。
1. 登陆qq --》 创建连接
2. 收发消息 --》 收发网络请求
3. 退出 qq --》 关闭连接
到了这里,大家有没有觉得这个聊天过程和我们之前学过的一个知识点很像?
文件操作
咱们在操作文件的时候是不是
1. 打开文件
2. 读写文件内容
3. 关闭文件
socket 其实就是一个用来处理网络请求的特殊的文件,
1. socket 是什么? IP+端口+协议 组成的一个特殊文件
2. socket 可以做什么? 接收或者应答网络请求
3. 通信的时候,socket必须成对儿出现
知道了原理,现在我们来看一下具体的代码。
## server 端 import socket ip_port = ('127.0.0.1', 12341) sk = socket.socket() # 生成一个对象,封装协议 sk.bind(ip_port) # 绑定 IP +PORT 找到目标主机的程序 sk.listen(5) # 监听, 定义最多可以挂起的连接数 while True: print('server waiting...') conn,addr = sk.accept() # 接受请求 # print(conn,addr) client_data = conn.recv(1024) # 接受消息 print(client_data.decode()) conn.sendall('不要回答,不要回答,不要回答'.encode(encoding="utf-8")) # 发送消息 conn.close() # 关闭连接
# client端 import socket ip_port = ('127.0.0.1', 12341) sk = socket.socket() # 生成一个对象,封装协议 sk.connect(ip_port) # 建立连接 sk.sendall('请求占领地球'.encode(encoding="UTF-8")) # 发送数据 server_reply = sk.recv(1024) # 接受数据 print(server_reply.decode()) sk.close() # 关闭连接
现在我们再来看一下 socket 完成的通信流程
在现实生活中,我们做的最多的事情可能就是上网了,那大家有没有想过,两台电脑之间的程序是如何通信的?
比如我们每天用 qq、微信 聊天的时候,你和好友的聊天内容是如何传输的?
你浏览网页的时候,浏览器又是如何从网站上把网页内容拿过来展示给你的?
所有的这些操作 都需要用到 我们今天要学的内容 —— socket 。
大家想一下,你和好友聊天的时候,必定会做的事情是什么?
接受 / 发送聊天内容
那我们在收发聊天内容的时候,是不是应该先连接上对方的电脑,聊完天之后,又是不是应该断开连接?
那我们从开始聊天 到聊天结束,做了几件事情呢? 我们可以简单的总结一下:
1. 创建连接
2. 收发聊天内容
3. 关闭连接
这三件事情其实是 socket 做的。
看见看 socket 做的这几件事情,有没有觉得跟我们之前学的哪个知识点很像?——文件操作。
文件操作做的三件事情是:
1. 打开文件
2. 读写文件
3. 关闭文件
我们之前学的文件操作是用来处理本地文件的。
而 socket 很像文件,但socket是用来处理网络通信的
我们再看,我们会发现 socket 做的 创建连接、收发聊天内容、关闭连接 都需要一个前提,
这三个操作,都需要找到并连接 指定电脑上的指定程序,否则通信无从谈起。
那如何找到呢? 有没有聪明的同学告诉我?
我们知道 通过 IP地址 可以找到网络中的一台电脑, 通过 协议和端口 可以 找到电脑中的特定程序。
那么 通过 IP + 端口 + 协议 我们就可以找到 指定电脑上的指定程序,实现网络数据的传输。
### 我们知道 IP 可以 标识网络中的指定电脑, 协议+端口 可以 标识主机中的 应用程序。
### 那么 通过 IP + 端口 + 协议 我们就可以唯一确定一台电脑上的程序,实现网络数据的传输。
那 IP + 端口 + 协议 组成的是什么呢? socket , 我们可以简单的将 socket 理解为 三者的组合。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作,Socket就是该模式的一个实现。
socket 其实就是一个由IP + 端口+ 协议 组成的 特殊文件, 他帮助应用程序 接收 或 应答 网络请求。
另外需要注意的是,在你和朋友用qq聊天的时候,你的电脑上有一个socket ,你朋友的电脑上是不是也应该有一个socket? socket 应该成对儿出现。
1. socket == IP + 端口 + 协议 组成的特殊文件
2. 帮助应用程序 接收或应答网络请求
3. 通信的时候必须成对儿出现
明白了原理,我们来看一下在python中 如何使用socket。
## server 端 import socket ip_port = ('127.0.0.1', 12341) sk = socket.socket() # 生成一个对象,封装协议 sk.bind(ip_port) # 绑定 IP +PORT 找到目标主机的程序 sk.listen(5) # 监听, 定义最多可以挂起的连接数 while True: print('server waiting...') conn,addr = sk.accept() # 接受请求 # print(conn,addr) client_data = conn.recv(1024) # 接受消息 print(client_data.decode()) conn.sendall('不要回答,不要回答,不要回答'.encode(encoding="utf-8")) # 发送消息 conn.close() # 关闭连接
# client端 import socket ip_port = ('127.0.0.1', 12341) sk = socket.socket() # 生成一个对象,封装协议 sk.connect(ip_port) # 建立连接 sk.sendall('请求占领地球'.encode(encoding="UTF-8")) # 发送数据 server_reply = sk.recv(1024) # 接受数据 print(server_reply.decode()) sk.close() # 关闭连接
现在我们再来看一下 socket 完成的通信流程。
socket
我们现在开始上课。
咱们平时上网聊天用的都是qq、微信。那问大家一个问题,你和好友的聊天内容是如何传输的? 下面让我来告诉大家
我们先从一个故事说起:
牛郎侄女的故事大家都听说过,银河两岸的牛郎织女一年只能见一次面,但是他们两个特别相爱,他们就想了一个办法,找了一只鸟——鸿雁帮忙送信,牛郎和织女还在各自的家门口放了一个邮箱。
每次这只鸟只要将信放在邮箱里就可以了。
但是住在银河两岸的神仙太多了,每次这只鸟都要找好久才能找到正确的邮箱在哪里。
为了保证信件的正确传递,两神在传递信件的时候,需要知道对方的地址和门牌号,通过地址和门牌号 就可以找到对方的邮箱。
如果将地址和门牌编号对应到邮箱上。那么 牛郎和织女只要向邮箱里放信或者取信就可以了。
牛郎和织女在收发邮件的时候,邮箱的工作模式是这样的
1. 打开邮箱
2. 收邮件/发邮件
3. 关闭邮箱
这个我们都明白了,那电脑之间如何通信?
我们知道我们的电脑都是通过网线连接的,但是网上那么多电脑,怎样才能找到你想找的那一台电脑呢?电脑运行那么多程序,又如何知道是哪一个程序要收发数据呢?
我们给电脑指定一个唯一不重复的编号,在给在电脑中运行的程序也指定一个唯一不重复的编号, 通过这两个编号,我们就可以找到指定电脑中的指定程序。
这里的电脑编号 我们叫做 IP地址 、程序编号我们叫做 端口
电脑编号就是 IP地址 —— 对应 —— 城市地址
程序编号 就是端口 —— 对应 —— 门牌号
socket —— 对应 —— 邮箱
通过socket 我们可以实现不同电脑上程序的通信。
socket 的工作模式是这样的:
1. 打开——创建连接
2. 接收数据/发送数据 —— 收发数据
3. 关闭——关闭连接
我们回想一下,我们之前操作文件的时候,是怎么操作的?
1. 打开文件
2. 读/写文件
3. 关闭文件
看了上面的例子,那socket 是个什么呢?
socket 其实是一个特殊的文件,通过socket 可以实现服务器和客户端之间的通信。我们也可以知道socket 在实现通信的时候, 必定是成对儿出现的。
今天我们就学习如何使用 socket 。我们先看一个具体的程序的运行效果。
## server 端 import socket ip_port = ('127.0.0.1', 12341) sk = socket.socket() # 生成一个对象,封装协议 sk.bind(ip_port) # 绑定 IP +PORT 找到目标主机的程序 sk.listen(5) # 监听, 定义最多可以挂起的连接数 while True: print('server waiting...') conn,addr = sk.accept() # 接受请求 # print(conn,addr) client_data = conn.recv(1024) # 接受消息 print(client_data.decode()) conn.sendall('不要回答,不要回答,不要回答'.encode(encoding="utf-8")) # 发送消息 conn.close() # 关闭连接
# client端 import socket ip_port = ('127.0.0.1', 12341) sk = socket.socket() # 生成一个对象,封装协议 sk.connect(ip_port) # 建立连接 sk.sendall('请求占领地球'.encode(encoding="UTF-8")) # 发送数据 server_reply = sk.recv(1024) # 接受数据 print(server_reply.decode()) sk.close() # 关闭连接
看了上面的例子,我们在总结一下,socket 的流程是什么样的。

其实我很多地方都要用到socket,只是我们看不到而已。
像我们的用的qq,浏览器和web服务器, 邮件客户端和邮件服务器、游戏客户端和游戏服务器等。
老陈有一个女儿在外地工作,不能经常回来,老陈和他的女儿通过信件联系。问老陈和他的女儿怎么把邮件邮寄给对方?
邮寄邮件的时候,需要知道的是城市街道和门牌号码。这样才能把邮件准确的邮寄到对方的手里。
老陈和他的女儿在收发信的时候,有四种状态
开始准备收发邮件
收邮件
发邮件
结束收发邮件
那我们的电脑程序是怎么互相通信的呢?
两台电脑之间通信也是,
电话
qq语音
浙公网安备 33010602011771号