Python 网络编程

image

现在的社会向互联网、AI 智能大踏步的高歌猛进,无论是互联网还是 AI 智能他们的基础都指向网络连接,试想一个没有网络连接的社会,大家每人一个功能机,那么什么互联网、什么 AI 智能这些统统靠边站。对于 python 来说,在网上找到的最多的还是网络爬虫的示例教程,其实最终还是网络编程,只是别人已经做好了框架我们只需要使用即可。

网络编程对于任何一门编程语言来说都是不可或缺的一部分,这里主要对 python 网络连接进行简单的应用以加深记忆。

网络编程中一个重要的概念即 Socket,通常我们用一个 Socket 来表示一个网络连接。网络连接又分 TCP 连接和 UDP 连接。TCP 连接是可靠的网络连接,通信双方均可以以流的方式发送数据,且发送方要保证接收方接收到数据。UDP 连接是无状态通信,无需真正建立连接,且发送方不保证接收方是否接收到数据。我们所接触到的网络连接通常都是 TCP 连接。

在创建 TCP 连接时,主动发起连接的叫做客户端,被动响应连接的叫服务器。当我们使用手机在谷歌上搜索数据时,谷歌的角色就是服务器,我们的手机就是客户端,因此手机的使用则被称为用户,而谷歌被称为服务提供商。

  1. 服务器

服务器的工作流程如下:

image

在服务器的工作过程中需要用到以下几个函数:

  • socket: 用来建立 socket 实例。
  • bind:用来绑定 IP 和端口。
  • listen:用来监听当前绑定 IP 和端口的连接时间。
  • accept:用来获取客户端地址和当前连接的 socket。
  • send 和 recv:用来向客户端发送数据和从客户端接收收据。

以下是完整的服务端代码:

# -*- coding:utf-8 -*-

import socket
import time

HOST = '127.0.0.1'
PORT = 1234

server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

server.bind((HOST, PORT))
server.listen(1)

conn, addr = server.accept()
print(addr)

with conn:
    print('Connected by %s:%s' % addr)
    while True:
        time.sleep(1)
        data = conn.recv(1024)
        if not data:
            break
        conn.send(("Hello, %s" % data.decode('utf-8')).encode('utf-8'))
    print('Disconnected %s:%s' % addr)

在该示例中创建了一个绑定在本机 1234 端口的服务器,用来接收客户端的连接,并将客户端发送过来的数据在发回给客户端。linsten(1) 表示同一时刻智能有一个客户端与连接到服务器,若要同时接收多个客户端的连接可修改该参数,且在每个客户端连接到该服务器是开启一个单独线程来处理通信事件。关于线程的知识请参考 Python 之进程与线程

  1. 客户端

客户端需要连接到一个服务器,首先需要知道该服务器的 IP 地址和端口号,我们常用的 web 服务的端口号是 80,SMTP 服务端口号是 25,FTP 服务端口号是 21。端口号小于 1024 的是 Internet 标准服务的端口,端口号大于 1024 的,可以任意使用。因此在自己编写的程序中的端口号都大于 1024,在我们自己编写的服务器中的端口号就设置为 1234。

客户端的工作流程

image

# -*- coding:utf-8 -*-

import socket


HOST = '127.0.0.1'
PORT = 1234

client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)

client.connect((HOST, PORT))

for data in [b'keinYe', b'Steven', b'Micheel']:
    client.send(data)
    print(client.recv(1024).decode('utf-8'))
client.close()

客户端程序通过 connect 函数连接到的服务器,连接到服务器后通过 send 函数来发送数据,通过 recv 函数来接收数据。

  1. 客户端与服务器的通信

将客户端和服务端连接并通信是检验代码是否正常工作的最好方法。单是需要注意的是在运行客户端之前要先将服务端运行起来,以下分别是服务端和客户端的运行结果。

服务端运行结果:

('127.0.0.1', 53431)
Connected by 127.0.0.1:53431
Disconnected 127.0.0.1:53431

客户端运行结果:

Hello, keinYe
Hello, Steven
Hello, Micheel
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 2,250评论 0 6
  • TCP/IP简介 计算机为了联网,就必须规定通信协议,早起的计算机网络。就是由各厂商自己规定一套协议,IBM、Ap...
    蓓蓓的万能男友阅读 1,682评论 0 2
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,370评论 0 10
  • 使用网络的目的就是为了联通多方然后进行通信用的,即把数据从一方传递给另外一方。前面的学习编写的程序都是单机的,即不...
    壁花烧年阅读 1,253评论 0 0
  • 网络 理论模型,分为七层物理层数据链路层传输层会话层表示层应用层 实际应用,分为四层链路层网络层传输层应用层 IP...
    FlyingLittlePG阅读 969评论 0 0

友情链接更多精彩内容