socket
什么是socket呢?在其他语言中也会遇到socket编程,socket套接字,大多数情况下用于网络编程,是unix的一种进程通信机制,从百度百科得到的一个形象的解释是 电话插座。
socket是服务端和客户端模型。socket创建成功后,服务端监听ip地址和端口。客户端可向服务端发起请求。从而建立连接进行通信。
在python中,socket模块可以用来创建套接字
基本范例
import socket
####################################################
# 服务端
#创建socket套接字对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#第一个参数是地址家族,第二个是套接字类型
#socket.AF_INET IPv4(默认)
#socket.AF_INET6 IPv6
#socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
#socket.SOCK_STREAM 流式socket , for TCP (默认)
#socket.SOCK_DGRAM 数据报式socket , for UDP
sock.bind(("127.0.0.1",8080))
# 里面的参数必须是一个双元素元组,主机,端口
sock.listen(5)
# 允许多少个客户端连接到服务器
conn, address = sock.accept()
# 等待客户端请求连接
conn.recv(1024)
# 等客户端连接上之后,可以给服务端发送数据,服务端接收数据。
conn.send("test")
# 发送数据
##############################################
#客户端
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1",8080))
# 客户端连接
sock.send("test")
# 客户端发送数据
sock.recv(1024)
# 客户端接受数据
# !如果请求完了,记着要关闭socket
sock.close()
socketserver
socketserver其实是对socket模块的封装,能使我们更好的使用socket模块。简化对socket服务端的编写,很轻易的实现一个多线程的socket服务端
首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法。
其次,你必须实例化一个服务器类,传入服务器的地址和请求处理程序类。
最后,调用select()或serve_forever()
server = SocketServer.ThreadingTCPServer(('192.168.1.105',port),CloudServer)
server.serve_forever()
简单web框架
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# created by hansz
from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
# 发送http响应的函数
start_response('200 OK', [('Content-Type', 'text/html')])
# 获取http请求的输入信息
url = environ['PATH_INFO']
# 对输入信息进行处理
obj,temp = url.split('/')
obj = __import__(obj)
is_exist = hasattr(obj, temp)
if is_exist:
func = getattr(obj, temp)
ret = func()
# 将函数返回值响应给请求者。
return ret
else:
return '404 not found'
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8001, RunServer)
print "Serving HTTP on port 8001..."
httpd.serve_forever()
利用socket实现简单的文件服务器
主要代码如下
# 客户端
while 1:
data = f1.read(1024)
if not data:
break
self.obj.send(data)
send_size = len(data) + send_size
percent = float(send_size) / float(file_size)
sys.stdout.write("\r已上传%0.2f%%"%(percent*100))
# 其实就是每次从文件读取一部分数据,然后发送到服务端
#######################################################
# 服务端
recv_status = True
recv_size = 0
data = ""
#f2 = file(file_name,"wb+")
while recv_status:
if int(file_size) - recv_size >0:
data += self.request.recv(1024)
recv_size = len(data)
else:
recv_size = 0
recv_status = False
# 服务端根据客户端之前发送过来的文件的大小来判断接受的大小。