18-Python网络编程

  • 第18章 网络编程和通信
    • 1 网络编程的基本概念
      • 11 网络基础知识
      • 12 TCPIP 协议简介
      • 13 IP地址与域名
      • 14 统一资源定位符 URL
    • 2 基础 socket 模块的网络编程
      • 21 socket 概述
        • 套接字
        • TCP通信程序设计
        • UDP 通信程序设计
      • 22 创建 socket 对象
      • 23 将服务器 socket 绑定到指定地址上
        • 主机名和 IP 地址
        • 绑定 socket 对象到 IP 地址
      • 24 服务器 socket 开始侦听
      • 25 连接和接收连接
      • 26 发送数据和接收数据
        • TCP
        • UDP
      • 27 简单TCP程序Echo Server

第18章 网络编程和通信

18.1 网络编程的基本概念

18.1.1 网络基础知识

18.1.2 TCP/IP 协议简介

18.1.3 IP地址与域名

18.1.4 统一资源定位符 URL

传输协议://主机 IP 地址(或域名地址)[:端口号]/资源所在路径和文件名

18.2 基础 socket 模块的网络编程

socket:IP 地址+一个端口号

18.2.1 socket 概述

1. 套接字

2. TCP通信程序设计

server
socket() bind() listen() accept() *() close() client socket() connect() *() close()

3. UDP 通信程序设计

server
socket() bind() *() close() client socket() *() close()

18.2.2 创建 socket 对象

# 参考,没用
socket(family = 2, type = 1, proto = 0, fileno = None)
family(默认 AF_INET)
    AF_INET  -----------> ipv4
    AF_INET6 -----------> ipv6
type(默认 SOCKET_STREAM)
    SOCKET_STREAM  -----> TCP
    SOCKET_DGRAM   -----> UDP

ex:

import socket
s1 = socket.socket()    # 创建用于TCP通信的套接字
s2 = socket.socket(socket.AF_INET, socket.SOCKET_STREAM) # 创建用于TCP通信的套接字
s3 = socket.socket(socket.AF_INET, socket.SOCKET_DGRAM)  # 创建用于UDPP通信的套接字

18.2.3 将服务器 socket 绑定到指定地址上

1. 主机名和 IP 地址

获取主机名和 IP 地址等信息
socket.gethostname()                # 返回主机名
socket.gethostbyname(hostname)      # 返回主机名的 IP 地址
socket.gethostbyname_ex(hostname)   # 返回扩展信息元组(hostname, aliaslist, ipaddrlist)
getfqdn([name])                     # 返回全限定名称
gethostbyaddr(ip_address)           # 返回 IP 地址的主机信息元组(hostname, aliaslist, ipaddrlist)
getservbyname(servicename [, protocolname])     # 返回服务所使用的端口号

2. 绑定 socket 对象到 IP 地址

sock.bind(address) # address:ip + port

ex:

sock = socket.socket()      # 创建socket对象

sock.bind('localhost', 8000)
sock.bind(socket.gethostname(), 8001)
sock.bind('127.0.0.1', 8002)

18.2.4 服务器 socket 开始侦听

sock.listen(backlog) # backlog是最多连接数,至少为1

ex:

sock.listen(5)

18.2.5 连接和接收连接

连接:客户机端socket对象通过connect方法尝试建立到服务器端socket对象的连接

client_sock.connect(address) # address:ip + port

接收连接:服务器端socket对象通过accept方法,进入waiting状态

clientsocket, address = server_sock.accept() # clientsocket是新建的socket对象,服务器通过它与客户端通信,address为对应的ip地址

18.2.6 发送数据和接收数据

TCP:

socket对象方法

send(bytes) # 发送数据bytes,返回实际发送的字节数
sendall(bytes) # 发送数据bytes,持续发送;成功返回None,否则出错
recv(bufsize) # 接收数据,返回接收到的数据,bytes对象,bufsize为接收的数据的最大字节数

UDP:

send(bytes) # 发送数据bytes,返回实际发送的字节数
recvfrom(bufsize [, flags]) # 接收数据,返回元组(bytes, address)—>address:发送的目标地址

18.2.7 简单TCP程序:Echo Server

# ChatServer.py Echo Server
import socket
serversocket = socket.socket()                      # 创建服务器socket
serversocket.bind(('127.0.0.1', 8000))                # 绑定IPaddress和port
serversocket.listen(1)                              # 开始侦听
clientsocket, clientaddress = serversocket.accept() # 使用阻塞方法accept等待连接请求
print('Connection from ', clientaddress)            # 接收客户机请求后输出客户机信息
while 1:
    data = clientsocket.recv(1024)                  # 接收数据
    if not data:
        break
    print('Received from client: ', repr(data))     # 输出接收的数据
    print('ECHO: ',repr(data))                      # 输出发送到客户机数据的信息
    clientsocket.send(data)                         # 回送数据到客户机
clientsocket.close()                                # 关闭 客户机socket
serversocket.close()                                # 关闭服务器socket
# ChatClient.py
import socket
clientsocket = socket.socket()                      # 创建socket对象 
clientsocket.connect(('127.0.0.1',8000))            # 连接到服务器
while 1:
    data = input('>')
    clientsocket.send(data.encode())                # 把数据转换为bytes对象,并发送到服务器
    if not data:
        break
    newdata = clientsocket.recv(1024)               # 接收服务器的回送数据
    print('Received from server: ', repr(newdata))  
clientsocket.close()                                # 关闭客户机socket

未完,待续···

你可能感兴趣的:(18-Python网络编程)