《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()    获取阻塞套接字操作的超时时间

(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
    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值