Python网络编程详解

1、服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。

2、客户端/服务器架构既可以应用于计算机硬件,也可以应用于计算机软件。

3、在服务器响应客户端之前,首先会创建一个通信节点,它能够使服务器监听请求。

一、套接字:通信端点

1、套接字

  套接字是计算机网络数据结构,它体现了上节中所描述的“通信端点”的概念。在任何类型的通信开始之前,网络应用程序必须创建套接字。

  有两种类型的套接字:基于文件和面向网络的。

2、套接字地址:主机-端口对

  如果一个套接字像一个电话插孔-允许通信的一些基础设施,那么主机名和端口号就像区号和电话号码的组合。有效的端口号范围为0-65535(小于1024的端口号预留给了系统)

3、面向连接的套接字和与无连接的套接字

  面向连接,在进行通信之前必须建立一个连接。实现这种连接类型主要协议是TCP(传输控制协议)

  无连接,在通信之前并不需要建立连接。主要协议是UDP(用户数据报协议)

二、Python中的网络编程

1、socket()模块函数

为创建TCP/IP套接字:tcpSock = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)

创建UDP/IP套接字:udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2.常见的套接字对象方法和属性

名称描述
服务器套接字方法 
s.bind() 将地址(主机名、端口号对)绑定到套接字上
s.listen()设置并启动TCP监听器
s.accept()被动接受TCP客户端连接,一直等待直到连接到达(阻塞)
客户端套接字方法 
s.connect()主动发起TCP服务器连接
s.connect_ex()connect的扩展版本,此时会以错误代码的形式返回问题,而不是抛出一个异常
普通的套接字方法 
s.recv()接受TCP消息
s.send()发送TCP消息
s.sendall()完整的发送TCP消息
s.recvfrom()接收UDP消息
s.shutdown()关闭连接
s.close()关闭套接字

3、创建TCP服务器

ss = socket() #创建服务器套接字

ss.bind() #套接字与地址绑定

ss.listen() #监听连接

inf_loop: #服务器无限循环

cs = ss.accept() #接收客户端连接

comm_loop: #通信循环

cs.recv()/cs.send() #对话(接收、发送)

cs.close() #关闭客户端套接字

ss.close() #关闭服务器套接字(可选)

#!/usr/bin/env python

#TCP时间戳服务器

from socket import *

from time import ctime

HOST = ''

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST,PORT)

tcpSerSock = socket(AF_INET,SOCK_STREAM)

tcpSerSock.bind(ADDR)

tcpSerSock.listen(5)

while True:

print('waiting for connecting...')

tcpClisock, addr = tcpSerSock.accept()

print('...connected from:',addr)

while True:

data = tcpClisock.recv(BUFSIZ)

if not data:

break

tcpClisock.send('[%s] %s' % (bytes(ctime(),'utf-8'),data))

tcpClisock.close()

tcpSerSock.close()

4、创建TCP客户端

cs = socket()

cs.connect()

comm_loop:

cs.send()/cs.recv()

cs.close()

#!/usr/bin/env python

#TCP时间戳客户端

from socket import *

HOST = '127.0.0.1'

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST,PORT)

tcpClisock = socket(AF_INET,SOCK_STREAM)

tcpClisock.connect(ADDR)

while True:

data = input('> ')

if not data:

break

tcpClisock.send(data)

data = tcpClisock.recv(BUFSIZ)

if not data:

break

print(data.decode('utf-8'))

tcpClisock.close()

5、创建UDP服务器

ss = socket()

ss.bind()

inf_loop:

cs = ss.recvfrom()/ss.sendto()

ss.close()

#!/usr/bin/env python

#UDP时间戳服务器

from socket import *

from time import ctime

HOST = ''

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST,PORT)

udpSerSock = socket(AF_INET,SOCK_DGRAM)

udpSerSock.bind(ADDR)

while True:

print('waiting for message...')

data, addr=udpSerSock.recvfrom(BUFSIZ)

udpSerSock.sendto('[%s] %s' % (ctime(),data),addr)

print('...received from and returned to:',addr)

udpSerSock.close()

6、创建UDP客户端

cs = socket()

comm_loop:

cs.send()/cs.recvfrom()

cs.close()

#!/usr/bin/env python

#UDP时间戳客户端

from socket import *

HOST = 'localhost'

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST,PORT)

udpClisock = socket(AF_INET,SOCK_DGRAM)

while True:

data = input('> ')

if not data:

break

udpClisock.sendto(data,ADDR)

data, ADDR=udpClisock.recvfrom(BUFSIZ)

if not data:

break

print(data)

udpClisock.close()

以上是 Python网络编程详解 的全部内容, 来源链接: utcz.com/z/336897.html

回到顶部