专栏首页keinYePython 网络编程

Python 网络编程

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

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

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

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

  1. 服务器

服务器的工作流程如下:

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

  • 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。

客户端的工作流程

# -*- 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

本文分享自微信公众号 - keinYe(keinYe_zh),作者:keinYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 网络编程

    1、服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求...

    用户1173509
  • Python:网络编程

    我将通过示例展示如何使用 Python 来编写以各种方式使用网络(如互联网)的程序。Python 提供了强大的网络编程的支持,有很多库实现了常见的网络协议以及基...

    不可言诉的深渊
  • Python网络编程

    TCP 客户端与服务器之间建立连接需要进行三次握手 客户端--->服务器 服务器--->客户端 客户端--->服务器,这样做的好处是可以保证数据的完整缺点是...

    云深无际
  • Python 网络编程

    IP地址:用来在网络中标记一台电脑,比如 192.168.1.1 ,在本地局域网上是唯一的。

    忆想不到的晖
  • Python网络编程

    CS响应速度快,安全性强,一般应用于局域网中,但是开发维护成本高;BS可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。所以有些单位日常办公应用BS...

    Dreamy.TZK
  • Python网络编程

    套接字是计算机网络数据结构。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将无法进行通信。

    py3study
  • python-网络编程

      socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定...

    yaohong
  • Python网络编程

    开启accept线程,执行accept操作开始阻塞,有客户端连接时,再开启一个线程recv进行数据接收的处理。然后accept线程继续阻塞,等待后续客户端的连接...

    职场亮哥
  • Python 网络编程

    IP地址:用来在网络中标记一台电脑,比如 192.168.1.1 ,在本地局域网上是唯一的。

    ZackSock

扫码关注云+社区

领取腾讯云代金券