Pyhon基础《网络编程》

1. 简介

网络编程主要的工作就是在发送端将信息通过指定的协议进行组装包,在接收端按照规定好的协议对包进行解析并提取出对应的信息,最终达到通信的目的。传输协议主要有 TCP 和 UDP,TCP 需要建立连接,是可靠的、基于字节流的协议,通常与 IP 协议共同使用;UDP 不需要建立连接,可靠性差,但速度更快。

网络编程有一个重要的概念 socket(套接字),应用程序可以通过它发送或接收数据,套接字允许应用程序将 I/O 插入到网络中,并与网络中的其他应用程序进行通信。

Python 提供了如下两个 socket 模块:

  • Socket:提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。

  • SocketServer:提供了服务器中心类,可以简化网络服务器的开发。


2. 使用

2.1 API 介绍

Python 中通过 socket() 函数来创建套接字对象,具体格式如下:

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

  • family:套接字协议族,可以使用 AF_UNIX(只能用于单一的 Unix 系统进程间通信)、AF_INET(服务器之间网络通信)

  • type:套接字类型,可以使用 SOCK_STREAM(面向连接的)、SOCK_DGRAM(非连接的)

套接字对象服务端方法:

方法描述
bind(address)将套接字绑定到地址,在 AF_INET 下以元组 (host,port) 的形式表示地址
listen([backlog])开始监听 TCP 传入连接,backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量,至少为1,大部分应用程序设为 5 就可以了
accept()接受 TCP 连接并返回 (conn,address),conn 是新的套接字对象,可以用来接收、发送数据,address 是连接客户端的地址

套接字对象客户端方法:

方法描述
connect(address)连接到 address 处的套接字,格式一般为元组 (hostname,port),如果连接出错,返回 socket.error 错误
connect_ex(address)功能与 connect(address) 相同,但是成功返回 0,失败返回 errno 的值

套接字对象公用方法:

方法描述
recv(bufsize[, flags])接受 TCP 套接字的数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量,flag 提供有关消息的其他信息,通常可以忽略
send(bytes[, flags])发送 TCP 数据,将 string 中的数据发送到连接的套接字,返回值是要发送的字节数量,该数量可能小于 string 的字节大小
sendall(bytes[, flags])完整发送 TCP 数据,将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据,成功返回 None,失败则抛出异常
recvfrom(bufsize[, flags])接受 UDP 套接字的数据,与 recv() 类似,但返回值是 (data,address),其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址
sendto(bytes, flags, address)发送 UDP 数据,将数据发送到套接字,address 是形式为 (ipaddr,port) 的元组,指定远程地址,返回值是发送的字节数
close()关闭套接字
getpeername()返回连接套接字的远程地址,类型通常是元组 (ipaddr,port)
getsockname()返回套接字自己的地址,通常是一个元组 (ipaddr,port)
setsockopt(level,optname,value)设置给定套接字选项的值
getsockopt(level, optname[, buflen])返回套接字选项的值
settimeout(value)设置套接字操作的超时时间,单位是秒
gettimeout()返回当前超时时间
fileno()返回套接字的文件描述符
setblocking(flag)如果 flag 为 0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值);非阻塞模式下,如果调用 recv() 没有发现任何数据或 send() 调用无法立即发送数据,那么将引起 socket.error 异常
makefile()创建一个与该套接字相关连的文件

2.2 TCP 方式

我们来看一下如何通过 socket 以 TCP 方式进行通信。

服务端基本思路:

  • 创建套接字,绑定套接字到 IP 与端口

  • 监听连接

  • 不断接受客户端的连接请求

  • 接收请求的数据,并向对方发送响应数据

  • 传输完毕后,关闭套接字

具体代码实现如下:

import socket
# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
# 监听连接
s.listen(5)
while True:
    print('等待客户端发送信息...')
    # 接收连接
    sock, addr = s.accept()
    # 接收请求数据
    data = sock.recv(1024).decode('utf-8')
    print('服务端接收请求数据:' + data)
    # 发送响应数据
    sock.sendall(data.upper().encode('utf-8'))
    # 关闭
    sock.close()

客户端基本思路:

  • 创建套接字,连接服务端

  • 连接后发送、接收数据

  • 传输完毕后,关闭套接字

具体代码实现如下:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端
s.connect(('127.0.0.1', 6666))
# 向服务端发送数据
s.sendall(b'hello')
# 接受服务端响应数据
data = s.recv(1024)
print('客户端接收响应数据:' + data.decode('utf-8'))
# 关闭
s.close()

我们只需先运行服务端代码,再运行客户端代码即可。

2.3 UDP 方式

我们再来看一下如何通过 socket 以 UDP 方式进行通信。

服务端基本思路:

  • 创建套接字,绑定套接字到 IP 与端口

  • 接收客户端请求的数据

  • 向客户端发送响应数据

具体代码实现如下:​​​​​​​

import socket
# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
while True:
    # 接收数据
    data, addr = s.recvfrom(1024)
    print('服务端接收请求数据:' + data.decode('utf-8'))
    # 响应数据
    s.sendto(data.decode('utf-8').upper().encode('utf-8'), addr)

客户端基本思路:

  • 创建套接字

  • 向服务端发送数据

  • 接受服务端响应数据

具体代码实现如下:​​​​​​​

import socket
# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 向服务端发送数据
s.sendto(b'hello', ('127.0.0.1', 6666))
# 接受服务端响应数据
data = s.recv(1024).decode('utf-8')
print('客户端接收响应数据:' + data)
# 关闭
s.close()

同样的,我们还是先运行服务端代码,再运行客户端代码即可。

小技巧 

设置pip源

在使用python的时候,大家免不了要引入各种包,但是光引入还不行,需要安装,这里就会使用pip安装包管理工具。有了pip安装就很简单,直接pip install 包名即可,可是由于某些包官网处在国外,我们安装时很慢很慢,还会断线timeout,所以有一个解决办法就是将pip的源换成国内的pip仓库,经常使用的比较可靠的有阿里、腾讯、清华、豆瓣等

清华pip源 :https://pypi.tuna.tsinghua.edu.cn/simple

豆瓣:http://pypi.douban.com/simple/

阿里: https://mirrors.aliyun.com/pypi/simple/

腾讯: http://mirrors.cloud.tencent.com/pypi/simple

怎么修改呢,如果你只想命令修改,那么就在每次安装的时候加上参数-I pip源地址即可

例如: pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

不想每次都加参数,直接替换怎么替换呢,就直接设置全局使用,比如是用清华:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

那又想恢复怎么办,pip config unset global.index-url这样就恢复了。还有一种方式就在windows的user目录下创建一个pip目录,例如:C:/Users/cillian/pip,然后新建一个pip.ini,内容就是如下这样的即可。

文案

“有些人见面只需要坐车,有些人见面却需要做梦。

好玩的代码(鼠标连点器)


import pyautogui as pag
from time import sleep, time

pag.PAUSE = 0


def mouse():
    b = input('请问您需要点击多少下?')
    b = int(b)
    c = input('点击时需要左键还是右键?\n左键请输入0,右键输入1:')
    c = int(c)
    print('请注意:您需要在8秒内将鼠标移动到您需要连点的地方,然后不要动,等待开始快速连点。')
    sleep(8)
    print('开始点击!')
    x, y = pag.position()
    d = 'left'
    if c:
        d = 'right'
    e = time()
    for i in range(0, b):
        pag.click(x, y, button=d)
    f = time() - e
    input('完成。用时%f秒。' % f)


def key():
    print('请在以下支持的按键中挑选您需要的键。')
    for i in pag.KEYBOARD_KEYS:
        print(r'%s' % i, end=' ')
    b = input('\n请输入您需要快速输入的字符:')
    if b in pag.KEYBOARD_KEYS:
        c = input('请输入您需要多少次输入:')
        c = int(c)
        print('请注意,您需要在8秒内切换到需要输入的窗口。')
        sleep(8)
        print('开始工作!')
        e = time()
        for i in range(0, c):
            pag.press(b)
        f = time() - e
        input('完成。用时%f秒。' % f)
    else:
        input('您输入的字符不属于支持字符,请修改。')


try:
    a = input('输入您需要的服务(数字):\n1:快速连点\n2:快速输入\n>>> ')
    a = int(a)
    if a == 1:
        mouse()
    elif a == 2:
        key()
    else:
        input('不好意思,没有找到您需要的服务。\n')
except Exception as e:
    print('错误;\n', e)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值