【博学谷学习记录】超强总结,用心分享|人工智能第十七课Python-TCP网络应用程序开发!

一、Python3编码转换

1、为什么要学习编码转换

在计算机网络中,数据都是以二进制的形式进行传输的。所以在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型

I Love Python => 字符串 => 转换为二进制数据 => 网络中传输

2、数据的编码转换

数据转换方法说明:

函数名说明
encode编码 将字符串转化为字节码
decode解码 将字节码转化为字符串

提示:encoed()和decode()函数可以接受参数,encoding是指在编解码过程中使用的编码方案。

字符串编码:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">str</span>.<span style="color:#000000">encode</span>(<span style="color:#000000">encoding</span>=<span style="color:#000000">”utf</span><span style="color:#981a1a">-</span><span style="color:#116644">8</span><span style="color:#000000">”</span>)</span></span>

二进制解码:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">bytes</span>.<span style="color:#000000">decode</span>(<span style="color:#000000">encoding</span>=<span style="color:#000000">“utf</span><span style="color:#981a1a">-</span><span style="color:#116644">8</span><span style="color:#000000">”</span>)</span></span>

二、TCP客户端及服务器端开发实践

1、TCP网络应用程序开发分类

① TCP客户端应用程序开发

② TCP服务器端应用程序开发

客户端程序是指运行在用户设备上的程序,服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。那如何记忆呢?

主动发起建立连接请求的是客户端程序,等待接受连接请求的是服务端程序。

2、TCP客户端程序开发流程及应用实践(五步走)

☆ 开发流程介绍

 

☆ socket类的介绍

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">①</span> <span style="color:#000000">导入socket模块</span>
<span style="color:#770088">import</span> <span style="color:#000000">socket</span>
​
<span style="color:#000000">②</span> <span style="color:#000000">创建客户端socket对象使用socket类</span>
<span style="color:#000000">socket</span>.<span style="color:#000000">socket</span>(<span style="color:#000000">AddressFamily</span>, <span style="color:#000000">Type</span>)</span></span>

客户端socket类的参数和方法说明:

参数名说明
AddressFamilyIP地址类型, 分为IPv4和IPv6
Type传输协议类型

开发客户端需要使用的函数:

 

☆ TCP客户端程序开发实践

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">import</span> <span style="color:#000000">socket</span>
​
<span style="color:#770088">if</span> <span style="color:#000000">__name__</span> == <span style="color:#aa1111">'__main__'</span>:
    <span style="color:#aa5500"># 1、创建客户端套接字对象</span>
    <span style="color:#000000">tcp_client_socket</span> = <span style="color:#000000">socket</span>.<span style="color:#000000">socket</span>(<span style="color:#000000">socket</span>.<span style="color:#000000">AF_INET</span>, <span style="color:#000000">socket</span>.<span style="color:#000000">SOCK_STREAM</span>)
    <span style="color:#aa5500"># 2、和服务器端套接字建立连接(参数必须是一个元祖)</span>
    <span style="color:#000000">tcp_client_socket</span>.<span style="color:#000000">connect</span>((<span style="color:#aa1111">"192.168.31.181"</span>, <span style="color:#116644">8080</span>))
    <span style="color:#aa5500"># 3、发送数据</span>
    <span style="color:#000000">tcp_client_socket</span>.<span style="color:#000000">send</span>(<span style="color:#aa1111">'hell, itheima'</span>.<span style="color:#000000">encode</span>(<span style="color:#000000">encoding</span>=<span style="color:#aa1111">'utf-8'</span>))
    <span style="color:#aa5500"># 4、接收数据</span>
    <span style="color:#000000">recv_data</span> = <span style="color:#000000">tcp_client_socket</span>.<span style="color:#000000">recv</span>(<span style="color:#116644">1024</span>).<span style="color:#000000">decode</span>(<span style="color:#aa1111">'utf-8'</span>)
    <span style="color:#3300aa">print</span>(<span style="color:#000000">recv_data</span>)
    <span style="color:#aa5500"># 5、关闭客户端套接字</span>
    <span style="color:#000000">tcp_client_socket</span>.<span style="color:#000000">close</span>()</span></span>

3、TCP服务器端开发流程及应用实践(七步走)

☆ 开发流程介绍

 

☆ socket类的介绍

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">①</span> <span style="color:#000000">导入socket模块</span>
<span style="color:#770088">import</span> <span style="color:#000000">socket</span>
​
<span style="color:#000000">②</span> <span style="color:#000000">创建客户端socket对象使用socket类</span>
<span style="color:#000000">socket</span>.<span style="color:#000000">socket</span>(<span style="color:#000000">AddressFamily</span>, <span style="color:#000000">Type</span>)</span></span>

客户端socket类的参数和方法说明:

参数名说明
AddressFamilyIP地址类型, 分为TPv4和IPv6
Type传输协议类型

开发客户端需要使用的函数:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">①</span> <span style="color:#000000">导入socket模块</span>
<span style="color:#770088">import</span> <span style="color:#000000">socket</span>
​
<span style="color:#000000">②</span> <span style="color:#000000">创建服务器端socket对象使用socket类</span>
<span style="color:#000000">socket</span>.<span style="color:#000000">socket</span>(<span style="color:#000000">AddressFamily</span>, <span style="color:#000000">Type</span>)</span></span>

客户端socket类的参数和方法说明:

参数名说明
AddressFamilyIP地址类型, 分为TPv4和IPv6
Type传输协议类型

开发服务器端需要使用的函数:

方法名说明
bind绑定IP地址和端口号
listen设置监听
accept等待接受客户端的连接请求
send发送数据
recv接收数据

☆ TCP服务器端程序开发实践

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">import</span> <span style="color:#000000">socket</span>
​
<span style="color:#770088">if</span> <span style="color:#000000">__name__</span> == <span style="color:#aa1111">'__main__'</span>:
    <span style="color:#aa5500"># 1、创建服务器端套接字对象</span>
    <span style="color:#000000">tcp_server_socket</span> = <span style="color:#000000">socket</span>.<span style="color:#000000">socket</span>(<span style="color:#000000">socket</span>.<span style="color:#000000">AF_INET</span>, <span style="color:#000000">socket</span>.<span style="color:#000000">SOCK_STREAM</span>)
    <span style="color:#aa5500"># 2、绑定IP地址与端口号</span>
    <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">bind</span>((<span style="color:#aa1111">""</span>, <span style="color:#116644">8888</span>))
    <span style="color:#aa5500"># 3、开启监听</span>
    <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">listen</span>(<span style="color:#116644">128</span>)
    <span style="color:#aa5500"># 4、等待接收客户端连接请求</span>
    <span style="color:#000000">conn_socket</span>, <span style="color:#000000">ip_port</span> = <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">accept</span>()
    <span style="color:#3300aa">print</span>(<span style="color:#aa1111">'客户端IP+端口:'</span>, <span style="color:#000000">ip_port</span>)
    <span style="color:#aa5500"># 5、接收数据</span>
    <span style="color:#000000">recv_data</span> = <span style="color:#000000">conn_socket</span>.<span style="color:#000000">recv</span>(<span style="color:#116644">1024</span>)
    <span style="color:#3300aa">print</span>(<span style="color:#aa1111">'接收到的数据:'</span>, <span style="color:#000000">recv_data</span>.<span style="color:#000000">decode</span>())
    <span style="color:#aa5500"># 6、发送数据</span>
    <span style="color:#000000">conn_socket</span>.<span style="color:#000000">send</span>(<span style="color:#aa1111">"客户端的数据已经收到了"</span>.<span style="color:#000000">encode</span>())
    <span style="color:#aa5500"># 7、关闭套接字</span>
    <span style="color:#000000">conn_socket</span>.<span style="color:#000000">close</span>()
    <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">close</span>()</span></span>

(==<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('10.1.1.10', 8888), raddr=('10.1.1.10', 48190)>==, ('10.1.1.10', 48190))

变量1,变量2 = (第一个元素值,第二个元素值)

4、TCP服务器端开发面向对象版本

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># 导入模块</span>
import socket
​
<span style="color:#aa5500"># 创建一个WebServer服务器端类</span>
class WebServer(object)<span style="color:#981a1a">:</span>
    <span style="color:#aa5500"># 定义__init__()魔术方法,用于对象初始化</span>
    def __init__(self)<span style="color:#981a1a">:</span>
        <span style="color:#aa5500"># 创建套接字对象</span>
        self.tcp_server_socket <span style="color:#981a1a">=</span> socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        <span style="color:#aa5500"># 绑定IP与端口号</span>
        self.tcp_server_socket.bind((<span style="color:#aa1111">""</span>, <span style="color:#116644">8090</span>))
        <span style="color:#aa5500"># 设置监听</span>
        self.tcp_server_socket.listen(<span style="color:#116644">128</span>)
​
    <span style="color:#aa5500"># 定义一个handle_client_request()</span>
    def handle_client_request(self, new_socket, ip_port)<span style="color:#981a1a">:</span>
        <span style="color:#aa5500"># 接收客户端消息</span>
        recv_data <span style="color:#981a1a">=</span> new_socket.recv(<span style="color:#116644">1024</span>)
        recv_data <span style="color:#981a1a">=</span> recv_data.decode(<span style="color:#aa1111">'gbk'</span>)
        print(f<span style="color:#aa1111">'{ip_port}客户端发送过来的消息:{recv_data}'</span>)
​
        <span style="color:#aa5500"># 返回(发送)消息给客户端</span>
        content <span style="color:#981a1a">=</span> <span style="color:#aa1111">'信息已收到,over,over!'</span>.encode(<span style="color:#aa1111">'gbk'</span>)
        new_socket.send(content)
​
        <span style="color:#aa5500"># 处理完成后,关闭新套接字对象</span>
        <span style="color:#aa5500"># new_socket.close()</span>
​
​
    <span style="color:#aa5500"># 定义一个start方法,用于启动WebServer,接收客户端连接</span>
    def <span style="color:#3300aa">start</span>(self)<span style="color:#981a1a">:</span>
        <span style="color:#770088">while</span> True<span style="color:#981a1a">:</span>
            <span style="color:#aa5500"># 等待客户端连接</span>
            new_socket, ip_port <span style="color:#981a1a">=</span> self.tcp_server_socket.accept()
            <span style="color:#aa5500"># 定义一个方法,用于接收和发送消息</span>
            self.handle_client_request(new_socket, ip_port)
​
​
<span style="color:#aa5500"># 创建程序执行入口,实例化WebServer类生成对象</span>
<span style="color:#770088">if</span> __name__ <span style="color:#981a1a">==</span> <span style="color:#aa1111">'__main__'</span><span style="color:#981a1a">:</span>
    <span style="color:#aa5500"># 实例化对象</span>
    ws <span style="color:#981a1a">=</span> WebServer()
    <span style="color:#aa5500"># 调用自身方法,用于启动服务</span>
    ws.<span style="color:#3300aa">start</span>()</span></span>

5、扩展:TCP服务器端开发之多客户端

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># 导入模块</span>
<span style="color:#770088">import</span> <span style="color:#000000">socket</span>
​
<span style="color:#aa5500"># 1、创建套接字对象</span>
<span style="color:#000000">tcp_server_socket</span> = <span style="color:#000000">socket</span>.<span style="color:#000000">socket</span>(<span style="color:#000000">socket</span>.<span style="color:#000000">AF_INET</span>, <span style="color:#000000">socket</span>.<span style="color:#000000">SOCK_STREAM</span>)
<span style="color:#aa5500"># 2、绑定IP与端口</span>
<span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">bind</span>((<span style="color:#aa1111">""</span>, <span style="color:#116644">8090</span>))
<span style="color:#aa5500"># 3、设置监听</span>
<span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">listen</span>(<span style="color:#116644">128</span>)
<span style="color:#aa5500"># 4、等待客户端连接</span>
<span style="color:#770088">while</span> <span style="color:#770088">True</span>:
    <span style="color:#aa5500"># 使用try...except捕获连接异常</span>
    <span style="color:#770088">try</span>:
        <span style="color:#000000">new_socket</span>, <span style="color:#000000">ip_port</span> = <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">accept</span>()
        <span style="color:#770088">while</span> <span style="color:#770088">True</span>:
            <span style="color:#770088">try</span>:
                <span style="color:#aa5500"># 5、接收客户端发送过来的消息</span>
                <span style="color:#000000">recv_data</span> = <span style="color:#000000">new_socket</span>.<span style="color:#000000">recv</span>(<span style="color:#116644">1024</span>)
​
                <span style="color:#000000">recv_data</span> = <span style="color:#000000">recv_data</span>.<span style="color:#000000">decode</span>(<span style="color:#aa1111">'gbk'</span>)
                <span style="color:#3300aa">print</span>(<span style="color:#aa1111">f'{ip_port}:{recv_data}'</span>)
​
                <span style="color:#000000">content</span> = <span style="color:#3300aa">input</span>(<span style="color:#aa1111">'服务器端消息:'</span>).<span style="color:#000000">encode</span>(<span style="color:#aa1111">'gbk'</span>)
                <span style="color:#000000">new_socket</span>.<span style="color:#000000">send</span>(<span style="color:#000000">content</span>)
​
            <span style="color:#770088">except</span> <span style="color:#000000">ConnectionResetError</span>:
                <span style="color:#3300aa">print</span>(<span style="color:#aa1111">f'{ip_port}客户端连接已经断开'</span>)
                <span style="color:#770088">break</span>
    <span style="color:#770088">except</span>:
        <span style="color:#3300aa">print</span>(<span style="color:#aa1111">'出错,退出服务器监听'</span>)
        <span style="color:#770088">break</span>
​
<span style="color:#aa5500"># 关闭套接字对象</span>
<span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">close</span>()
​</span></span>

6、TCP网络应用程序开发注意点

 

端口复用:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">import</span> <span style="color:#000000">socket</span>
​
<span style="color:#770088">if</span> <span style="color:#000000">__name__</span> == <span style="color:#aa1111">'__main__'</span>:
    <span style="color:#aa5500"># 1、创建服务器端套接字对象</span>
    <span style="color:#000000">tcp_server_socket</span> = <span style="color:#000000">socket</span>.<span style="color:#000000">socket</span>(<span style="color:#000000">socket</span>.<span style="color:#000000">AF_INET</span>, <span style="color:#000000">socket</span>.<span style="color:#000000">SOCK_STREAM</span>)
    <span style="color:#aa5500"># 设置端口复用</span>
    <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">setsockopt</span>(<span style="color:#000000">socket</span>.<span style="color:#000000">SOL_SOCKET</span>, <span style="color:#000000">socket</span>.<span style="color:#000000">SO_REUSEADDR</span>, <span style="color:#770088">True</span>)
    <span style="color:#aa5500"># 2、绑定IP地址与端口号</span>
    <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">bind</span>((<span style="color:#aa1111">""</span>, <span style="color:#116644">8888</span>))
    <span style="color:#aa5500"># 3、开启监听</span>
    <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">listen</span>(<span style="color:#116644">128</span>)
    <span style="color:#aa5500"># 4、等待接收客户端连接请求</span>
    <span style="color:#000000">conn_socket</span>, <span style="color:#000000">ip_port</span> = <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">accept</span>()
    <span style="color:#3300aa">print</span>(<span style="color:#aa1111">'客户端IP+端口:'</span>, <span style="color:#000000">ip_port</span>)
    <span style="color:#aa5500"># 5、接收数据</span>
    <span style="color:#000000">recv_data</span> = <span style="color:#000000">conn_socket</span>.<span style="color:#000000">recv</span>(<span style="color:#116644">1024</span>)
    <span style="color:#3300aa">print</span>(<span style="color:#aa1111">'接收到的数据:'</span>, <span style="color:#000000">recv_data</span>.<span style="color:#000000">decode</span>())
    <span style="color:#aa5500"># 6、发送数据</span>
    <span style="color:#000000">conn_socket</span>.<span style="color:#000000">send</span>(<span style="color:#aa1111">"客户端的数据已经收到了"</span>.<span style="color:#000000">encode</span>())
    <span style="color:#aa5500"># 7、关闭套接字</span>
    <span style="color:#000000">conn_socket</span>.<span style="color:#000000">close</span>()
    <span style="color:#000000">tcp_server_socket</span>.<span style="color:#000000">close</span>()</span></span>

本期的笔记分享就到这里啦,下期分享HTTP协议的介绍!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值