《Python核心编程》之网络编程快速入门

1.套接字(socket)含义

套接字在网络编程中是通信的端口,好比电话的插孔,没有它,网络中便无法实现通信。

2.套接字家族(socket_family)

套接字有多个家族,比如AF_LOCAL(基于文件), AF_INET(面向网络), AF_TIPC(支持透明的进程间通信协议), AF_NETLINK(允许使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC)。

3.套接字类型(socket_type)

两种类型,一是面向连接的套接字,典型的有TCP; 二是无连接的套接字, 典型的有UDP。

4.Python中的网络编程

Python网络编程使用的主要模块就是socket模块,在该模块中可以找到socket()函数,该函数用于创建套接字对象。套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。
4.1. socket() 模块函数
socket.socket()函数的一般语法如下:
socket(socket_family, socket_type, protocol=0),
其中,socket_family是AF_UNIX或AF_INET, socket_type是SOCK_STREAM或SOCK_DGRAM。protocol通常省略,默认为0。
Example:
tcp_socket = socket.socket(socket.AF_INET, socket.STREAM)
udp_socket = socket.socket(socket.AF_INET, socket.DGRAM)

4.2. 套接字对象方法
(1).服务器套接字方法
s.bind()    将地址(主机名,端口号对)绑定到套接字上
s.listen()    设置并启动TCP监听器
s.accept()    被动接受TCP客户端连接,一直等待直到连接到达

(2).客户端套接字方法
s.connect()    主动发起TCP服务器连接
s.connect_ex()    connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出异常

(3).普通的套接字方法
s.recv()    接收套接字消息
s.recv_into()    接收TCP消息到指定的缓冲区
s.send()    发送TCP消息
s.sendall()    完整的发送TCP请求
s.recvfrom()    接收UDP消息
s.recvfrom_into()    接收UDP消息到指定的缓冲区
s.sendto()    发送UDP消息
s.getpeername()    连接到套接字(TCP)的远程地址
s.getsockname()    当前套接字的地址
s.getsockopt()    返回给定套接字选项的值
s.shutdown()    关闭连接
s.close()    关闭套接字
s.detach()    在未关闭文件描述符的情况下关闭套接字,返回文件描述符

(4).面向阻塞的的套接字方法
s.setblocking()    设置套接字的阻塞或非阻塞模式
s.settimeout()    设置阻塞套接字的超时时间
s.gettimeout()    获取阻塞套接字操作的超时时间

扫描二维码关注公众号,回复: 4802839 查看本文章

(5).面向文件的套接字方法
s.fileno()    套接字的文件描述符
s.makefile()    创建与套接字关联的文件对象

(6).数据属性
s.family    套接字家族
s.type        套接字类型
s.proto        套接字协议

4.3 创建TCP
4.3.1 创建TCP服务器
ss = socket()        # 创建服务器套接字
ss.bind()        # 套接字与地址绑定
ss.listen()        # 监听连接
inf_loop:        # 服务器无限循环
    cs = ss.accept()    # 接收客户端连接
    comm_loop:        # 通信循环
        cs.recv()/cs.send() # 对话(接收/发送)
    cs.close()        # 关闭客户端套接字
ss.close()         # 关闭服务器套接字
TCP时间戳服务器tsTServ.py

#! /usr/bin/env python

from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcp_server_socket = socket(AF_INET, SOCK_STREAM)
tcp_server_socket.bind(ADDR)
tcp_server_socket.listen(5)

while True:
    print('waiting for connection...')
    tcp_client_socket, addr = tcp_server_socket.accept()
    print('...connected from', addr)
    
    while True:
        data = tcp_client_socket.recv(BUFSIZ)
        if not data:
            break
        tcp_client_socket.send('[%s] %s' % (bytes(ctime(), 'utf-8'), data))
    tcp_client_socket.close()
tcp_server_socket.close()

4.4.2 创建TCP客户端
cs = socket()            # 创建客户端套接字
cs.connect()            # 尝试连接服务器
comm_loop:                # 通信循环
    cs.send()/cs.recv() # 对话(发送,接收)
cs.close()
TCP时间戳客户端tsTclnt.py

#! /usr/bin/env python

from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcp_client_socket = socket(AF_INET, SOCK_STREAM)
tcp_client_socket.connect(ADDR)

while True:
    data = input('> ')
    if not data:
        break
    tcp_client.send(data.encode('utf-8'))
    data = tcp_client_socket.recv(BUFSIZE)
    if not data:
        break
    print(data.decode('utf-8'))
tcp_client_socket.close()

4.4 创建UDP
4.4.1 创建UDP服务器
ss = socket()
ss.bind()
inf_loop:
    cs = ss.recvfrom() / ss.sendto()
ss.close()
UDP时间戳服务器 tsUserv.py

#!/usr/bin/env python

from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

udp_server_socket = socket(AF_INET, SOCK_DGRAM)
udp_server_socket.bind(ADDR)

while True:
    print('waiting for message...')
    data, addr = udp_server_socket.recvfrom(BUFSIZ)
    udp_server_socket.sendto('[%s] %s' % (ctime(), data), addr)
    print('...received from and returned to:', addr)

udp_server_socket.close()

4.4.2 创建UDP客户端
cs = socket()                        # 创建客户端套接字
comm_loop:                            # 通信循环
    cs.sendto() / cs.recvfrom()        # 对话(发送 / 接收)
cs.close()                            # 关闭客户端套接字
UDP时间戳客户端 tsUclnt.py

#! /usr/bin/env python
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

udp_client_socket = socket(AF_INET, SOCK_DGRAM)

while True:
    data = input('> ')
    if not data:
        break
    udp_client_socket.sendto(data, ADDR)
    data, ADDR = udp_client_socket.recvfrom(BUFSIZ)
    if not data:
        break
    print(data.decode('utf-8'))

udp_client_socket.close()

5.相关链接

官方文档是最好的学习材料,入门之后可以仔细学习官文:https://docs.python.org/3/library/socket.html
    

猜你喜欢

转载自blog.csdn.net/qq_37597345/article/details/84821939
今日推荐