python socket发送数组_Python 进阶(十):网络编程

a6f66851745e19abcdee0f741a6701e7.png

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(非连接的)

套接字对象服务端方法:

ae9b9d50e01bd1798c852ac10b885830.png

套接字对象客户端方法:

ddb54f9d102ed3fdcac0d5a18b397785.png

套接字对象公用方法:

fa3b41a151c2ad386663bba09ed90681.png

4eb2f48f8ec65e980934f2f290da4963.png

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()

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

Python 进阶(十):网络编程​mp.weixin.qq.com
9aa54b5bf9683f96cead350ae2de4fca.png

版权声明:本文为weixin_39846089原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。