Python-网络编程(一)

基于Python语言的网络编程,主要是socket网络通信

socket网络通信

概念

1
2
3
4
5
用于网络计算机通信的一种接口
利用socket在系统软件级实现数据收发处理
最早由加州大学伯克利分校开发
是目前互联网通信的基础、标准
计算机双方要进行通信,必须创建socket

处理流程

  1. 服务器

    1
    2
    3
    4
    5
    6
    7
    创建(socket)
    绑定地址(bind)
    监听(listen)
    接受(accept)
    接收数据(recv)
    发送数据(send)
    关闭连接(close)
  2. 客户端

    1
    2
    3
    4
    5
    创建(socket)
    连接服务器(connect)
    发送数据(send)
    接收数据(recv)
    关闭连接(close)

套接字类型

  1. 流式套接字(SOCK_STREAM):

    1
    2
    3
    面向连接、可靠传输、数据无差错的收发序列
    提供流量控制功能
    数据被看做字节流,长度无限制,多个数据包的数据持续流入
  2. 数据报套接字(SOCK_DGRAM)

    1
    2
    面向无连接、不可靠传输,数据可能丢失、错误、重发
    数据构成一个一个独立的数据报,每次一次发送就是一个数据报

Socket方法

  1. 创建

    1
    2
    3
    4
    5
    6
    socket.socket(socket_family = AF_INET,  socket_type = SOCK_STREAM, proto = 0)
    参数:socket_family 地址族类型, 默认填写AF_INET
    socket_type 套接字类型
    SOCK_STREAM 流式套接字
    SOCK_DGRAM 数据报套接字
    proto 子协议类型,默认填写0
  2. 绑定:绑定IP地址和端口

    1
    2
    socket.bind(address)
    参数:address 地址,元组类型; 第一个值为IP,第二个值为端口
  3. 监听:使服务器可以接收连接请求

    1
    2
    socket.listen(backlog)
    参数: backlog 未接收连接请求个数; 超过该值,则会拒绝后面的请求
  4. 接受连接:

    1
    2
    3
    4
    connfd,addr = sockfd.accept()
    功能:阻塞,等待客户端连接请求;
    如果有新的连接,则返回;
    返回值为一个新的socket(用于数据通信)和客户端地址
  5. 接收数据:

    1
    2
    3
    4
    5
    data = connfd.recv(buffersize)
    功能 : 流式套接字接收消息
    参数 : 一次最多接收多大的消息 字节
    返回值 : 返回接收到的内容
    如果对方关闭或发送完成,则返回空串
  6. 发送数据:

    1
    2
    3
    4
    n = connfd.send(data)
    功能 : 流式套接字发送消息
    参数 : 要发送的内容 要求bytes格式
    返回值 : 返回实际发送的字节数
  7. 关闭套接字:

    1
    2
    sockfd.close()
    功能:关闭套接字 tcp套接字连接断开
  8. 请求连接(只能在客户端调用)

    1
    2
    3
    sockfd.connect(addr)
    功能: 连接服务端套接字
    参数: addr 服务端地址

示例程序

简单交互

服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import socket

address = ("127.0.0.1", 9999)

svr = socket.socket()
svr.bind(address)
svr.listen(10)
print("服务器已启动:", address)

sockfd, addr = svr.accept()
print("收到客户端请求:", addr)

data = sockfd.recv(1024)
print(data.decode())

sockfd.close()
svr.close()
客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
import socket

address = ("127.0.0.1", 9999)

client = socket.socket()
client.connect(address)
print("连接服务器成功")

msg = "This is test msg"
client.send(msg.encode())

print("发送消息:",msg)
client.close()

循环接收

服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket
address = ("127.0.0.1", 9999)
svr = socket.socket()
svr.bind(address)
svr.listen(10)
print("服务器已启动:", address)
sockfd, addr = svr.accept()
print("收到客户端请求:", addr)
while True:
data = sockfd.recv(1024)
if data == "":
sockfd.close()
print(data.decode())
svr.close()
循环客户端
1
2
3
4
5
6
7
8
9
10
11
12
import socket
address = ("127.0.0.1", 9999)
client = socket.socket()
client.connect(address)
print("连接服务器成功")
while True:
msg = input("请输入要发送的消息:")
if msg == "q" or msg == "Q":
break
client.send(msg.encode())
print("发送消息:",msg)
client.close()