您的位置:首页 > 理论基础 > 计算机网络

Python网络编程(Socket Tcp Udp)

2017-05-24 11:31 495 查看
Socket简介   在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个链接的一端称为一个Socket(套接字),用于描述IP地址和端口。   建立网络通信连接至少要一对端口号(Socket),Socket本质是编程接口(API),对TCP/IP的封装,提供了网络通信能力。   每种服务都打开一个Socket,并绑定到端口上,不同的端口对应不同的服务,就像http对应80端口。   Socket是面向C/S(客户端/服务器)模型设计,客户端在本地随机申请一个唯一的Socket号,服务器拥有公开的socket,任何客户端都可以向它发送连接请求和信息请求。Socket数据处理流程如图:socket
方法 描述
socket.socket([family[, type[, proto]]]) socket初始化函数,(地址族,socket类型,协议编号)协议编号默认0
socket.AF_INET IPV4协议通信
socket.AF_INET6 IPV6协议通信
socket.SOCK_STREAM socket类型,TCP
socket.SOCK_DGRAM socket类型,UDP
socket.SOCK_RAW 原始socket,可以处理普通socker无法处理的报文,比如ICMP
socket.SOCK_RDM 更可靠的UDP类型,保证对方收到数据
socket.SOCK_SEQPACKET 可靠的连续数据包服务
   socket.socket() 对象操作方法
accept() 接受连接并返回(socket object, address info),address是客户端地址
bind(address) 绑定socket到本地地址,address是一个双元素元组(host,port)
listen(backlog)	开始接收连接,backlog是最大连接数,默认1
connect(address) 连接socket到远程地址
connect_ex(address)	连接socket到远程地址,成功返回0,错误返回error值
getpeername() 返回远程端地址(hostaddr, port)
gettimeout()	 返回当前超时的值,单位秒,如果没有设置返回none
recv(buffersize[, flags]) 接收来自socket的数据,buffersize是接收数据量
send(data[, flags]) 发送数据到socket,返回值是发送的字节数
sendall(data[, flags]) 发送所有数据到socket,成功返回none,失败抛出异常
setblocking(flag) 设置socket为阻塞(flag是true)或非阻塞(flag是flase)
socket工作流程1)打开socket2)绑定到一个地址和端口3)监听进来的连接4)接受连接5)处理数据SocketServer (服务端高级库,实现多进程和多线程,并处理多个客户端请求)   常用类:
SocketServer.TCPServer(server_address,
RequestHandlerClass, bind_and_activate=True) 服务器类,TCP协议
SocketServer.UDPServer(server_address,
RequestHandlerClass, bind_and_activate=True) 服务器类,UDP协议
SocketServer.BaseServer(server_address,
RequestHandlerClass) 这个是所有服务器对象的超类。它定义了接口,不提供大多数方法,在子类中进行。
SocketServer.BaseRequestHandler	这个是所有请求处理对象的超类。它定义了接口,一个具体的请求处理程序子类必须定义一个新的handle()方法。
SocketServer.StreamRequestHandler	流式socket,根据socket生成读写socket用的两个文件对象,调用rfile和wfile读写
SocketServer.DatagramRequestHandler	数据报socket,同样生成rfile和wfile,但UDP不直接关联socket。这里rfile是由UDP中读取的数据生成,wfile则是新建一个StringIO,用于写数据
SocketServer.ForkingMixIn/ThreadingMixIn	多进程(分叉)/多线程实现异步。混合类,这个类不会直接实例化。用于实现处理多连接
 
 SocketServer
.
BaseServer()对象有以下方法:
fileno()	返回一个整数文件描述符上服务器监听的套接字
handle_request()	处理一个请求
serve_forever(poll_interval=0.5)	处理,直至有明确要求shutdown()的请求。轮训关机每poll_interval秒
shutdown()	告诉serve_forever()循环停止并等待
server_close()	清理服务器
address_family	地址族
server_address	监听的地址
RequestHandlerClass	用户提供的请求处理类
socket	socket对象上的服务器将监听传入的请求
allow_reuse_address	服务器是否允许地址的重用。默认False
request_queue_size	请求队列的大小。
socket_type	socket类型。socket.SOCK_STREAM或socket.SOCK_DGRAM
timeout	超时时间,以秒为单位
finish_request()	实际处理通过实例请求RequestHandleClass并调用其handle()方法
get_request()	必须接受从socket的请求,并返回
handle_error(request, client_address)	如果这个函数被条用handle()
process_request(request, client_address)	?
server_activate()	?
server_bind()	由服务器构造函数调用的套接字绑定到所需的地址
verify_request(request, client_address)	返回一个布尔值,如果该值是True,则该请求将被处理,如果是False,该请求将被拒绝。
1)创建类,继承请求处理类(BaseRequestHandler),并重载其handle()方法,此方法将处理传入的请求2)实例化服务器类之一,它传递服务器的地址和请求处理程序类3)调用handle_request()或serve_forever()服务器对象的方法来处理一个或多个请求4)调用server_close()关闭套接字 TCP编程  服务端
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
#使用IPV4协议,采用TCP端口
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定网卡和端口
s.bind(('127.0.0.1',8888))
#最大连接数,设置监听
s.listen(1)
while True:
#返回客户端地址,阻塞状态,被动等待客户端连接
conn,addr=s.accept()
print('Connected by',addr)
#服务端发送欢迎
conn.send(bytes('hello world',encoding='utf-8'))
#服务端接收客户端请求
client_data=str(conn.recv(1024),encoding='utf-8')
print('accept client:',client_data)
conn.close()
   客户端
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',8888))
data = s.recv(1024) #接收服务端数据
print('Recvied:',str(data,encoding='utf-8'))
send_data=input('输入请求')
s.sendall(bytes(send_data,encoding='utf-8'))
s.close()
UDP编程   服务端
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
#使用IPV4协议,采用udp端口
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定网卡和端口
s.bind(('127.0.0.1',8888))
while True:
#获得客户端数据和端地址端口
data,addr=s.recvfrom(1024)
print('Received from %s:%s.' % addr)
print('Received data',data.decode('utf-8'))
s.sendto(b'hello client',addr)
   客户端
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data=b'Hello server'
#发送到服务器
s.sendto(data,('127.0.0.1',8888))
print(s.recv(1024).decode('utf-8'))
s.close()
   学习博客: http://lizhenliang.blog.51cto.com/7876557/1879549学习博客:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004977916a212e2168e21449981ad65cd16e71201000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket python