冰冻三尺非一日之寒-socket
第八章
- Socket语法及相关
- SocketServer实现多并发
socket概念:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
# Author:chen
#_-_coding:utf-8_-_
import socketserver
import os class MyTCPHandler(socketserver.BaseRequestHandler):
flag=False
def handle(self):
while not self.flag:
msg=self.request.recv(1024)#接收客户端请求
#print(type(msg))
if not msg:
break
msg_n=msg.decode().split('>')
msg_type=msg_n[1]
if hasattr(self,msg_type):
func=getattr(self,msg_type)
func(msg_n)
def get_file(self,msg): #回应客户端下载
file_name= msg[1]
if os.path.isfile(file_name):
file_size=os.path.getsize(file_name)
#print('file_size',type(file_size))
send_msg='yes:%s'%(file_size)
self.request.send(send_msg.encode())
client_recv=self.request.recv(1024).decode()
if client_recv=='ok':
f=open(file_name,'rb')
send_size=0
print('send_size', type(send_size))
while not send_size==file_size:
if file_size-send_size<=1024:
self.request.send(f.read(file_size-send_size))
send_size+=file_size-send_size
else:
self.request.send(f.read(1024))
send_size+=1024
else:
print("为文件下载传输完成")
f.close()
else:
print('不予下载')
def put_file(self,msg): #回应客户端上传
#client_res = self.request.recv(1024)
file_name,file_size=msg[1],int(msg[2])
if os.path.isfile(file_name):
f=open('%s.new' %(file_name),'wb')
else:
f=open(file_name,'wb')
self.request.send(b'ok')#发送给客户端
recv_size=0
while not recv_size==file_size:
data=self.request.recv(1024)
#print('data:',data)
recv_size+=len(data)
f.write(data)
else:
print("文件上传完成")
f.close()
if __name__=="__main__":
HOST,PORT='0.0.0.0',9999
server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
# Author:chen
#_-_coding:utf-8_-_
import socket,os
class Myclient(object):
user_dict={
'help':'help',
'get':'get_file',
'put':'put_file',
'cd':'cd',
'exit':'exit'
}
def __init__(self,host,port):
self.sock=socket.socket()
self.sock.connect((host,port))
self.flag=False
#if self.auth():
self.userinput() def userinput(self):
while True:
u_input=input('please input your muan:')
if u_input=='':continue
user_input=u_input.split()
user_Type=u_input.split()[0]
print("客户端的请求是:",user_Type)
if user_Type in self.user_dict:
func=getattr(self,self.user_dict[user_Type])
func(user_input)
else:
print("命令不存在,请重新输入")
self.help()
def help(self):
print(self.user_dict)
def put_file(self,u):
if len(u)==2:
if os.path.isfile(u[1]):
file_size=os.path.getsize(u[1])
msg='put>%s>%s' % (u[1],file_size)
self.sock.send(msg.encode())
res_back=str(self.sock.recv(1024).decode())
print("res_back:",res_back)
if "ok" in res_back:
f = open(u[1],'rb')
send_size=0
while not send_size==file_size:
if file_size-send_size<=1024:
data=f.read(file_size-send_size)
send_size+=file_size-send_size
else:
data=f.read(1024)
send_size+=1024
self.sock.send(data)
else:
print('文件上传完成')
f.close()
else:
print('文件不存在')
def get_file(self,u):
if len(u)==2:
msg="get>%s>2"%u[1]
self.sock.send(msg.encode())
res_back=self.sock.recv(1024).decode()
print(res_back)
if 'yes'in res_back:
f=open(u[1],'wb')
file_size=int(res_back.split(':')[1])
self.sock.send(b'ok')
size_revc=0
while not size_revc==file_size:
data=self.sock.recv(file_size-size_revc)
size_revc+=len(data)
f.write(data)
else:
print('下载完成')
f.close()
else:
print('+++++')
if __name__=="__main__":
c=Myclient('localhost',9999)
comefrom http://www.cnblogs.com/alex3714/articles/5227251.html
socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) #获取要连接的对端主机地址
sk.bind(address)
s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。
sk.listen(backlog)
开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5
这个值不能无限大,因为要在内核中维护连接队列
sk.setblocking(bool)
是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
sk.accept()
接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
接收TCP 客户的连接(阻塞式)等待连接的到来
sk.connect(address)
连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
sk.connect_ex(address)
同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061
sk.close()
关闭套接字
sk.recv(bufsize[,flag])
接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
sk.recvfrom(bufsize[.flag])
与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
sk.send(string[,flag])
将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。
sk.sendall(string[,flag])
将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
内部通过递归调用send,将所有内容发送出去。
sk.sendto(string[,flag],address)
将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。
sk.settimeout(timeout)
设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )
sk.getpeername()
返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
sk.getsockname()
返回套接字自己的地址。通常是一个元组(ipaddr,port)
sk.fileno()
套接字的文件描述符
socket.sendfile(file, offset=0, count=None)
发送文件 ,但目前多数情况下并无什么卵用。
常用函数(来自百度百科):
创建
(family)。常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域Socket)、
AF_ROUTE等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号
(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。流式
Socket(SOCK_STREAM)是一种面向连接的Socket,针对于面向连接的TCP服务应用。数据报式Socket(SOCK_DGRAM)
是一种无连接的Socket,对应于无连接的UDP服务应用。
绑定
接收
指示应该从套接字的错误队列上接收错误值,依据不同的协议,错误值以某种辅佐性消息的方式传递进来,使用者应该提供足够大的缓冲区。导致错误的原封包通过
msg_iovec作为一般的数据来传递。导致错误的数据报原目标地址作为msg_name被提供。错误以sock_extended_err结构形态被
使用。
发送
接收连接请求
冰冻三尺非一日之寒-socket的更多相关文章
- 冰冻三尺非一日之寒--web框架Django(翻页、cookie)
第二十一章 cookie 1.获取Cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, ...
- 冰冻三尺非一日之寒--web框架Django(三)
第二十章: django(三,多对多) 1.Django请求的生命周期 路由系统 -> 视图函数(获取模板+数据-->渲染) -> 字符串返回给用户 2. ...
- 冰冻三尺非一日之寒--Django框架【进阶篇】
第十九章 Django进阶 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
- 冰冻三尺非一日之寒--web框架Django
1.JS 正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf ...
- 冰冻三尺非一日之寒--jQuery
第十七章 jQuery http://jquery.cuishifeng.cn/ 一.过滤选择器: 目的:处理更复杂的选择,是jQuery自定义的,不是CSS3中的选择器. ...
- 冰冻三尺非一日之寒--js dom
1. 写页面是觉得丑 float,clear:both,margin,padding position: left: 网 ...
- 冰冻三尺非一日之寒--还是web
第十五章 javascript(js) DOM编程 javascript介绍 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript ...
- 冰冻三尺非一日之寒--web来了
第十四章 html css 1-1Html和CSS的关系学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的:1. H ...
- 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)
第十二章 mysql ORM介绍 2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...
随机推荐
- GPU大百科全书索引(有助于理解openGL工作流程)
GPU大百科全书索引 0.GPU大百科全书 前传 看图形与装修的关系 1.GPU大百科全书 第一章:美女 方程与几何 2.GPU大百科全书 第二章 凝固生命的光栅化 3.GPU大百科全书 第三章:像素 ...
- android中的线程池学习笔记
阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...
- Python爬虫代理池
爬虫代理IP池 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来 ...
- explicit抑制隐型转换
本文出自 http://www.cnblogs.com/cutepig/ 按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: clas ...
- Forbidden You don't have permission to access / on this server PHP
在新安装的谷歌游览器里,打不了PHP网站了,错误显示: Forbidden You don't have permission to access / on this server. 原因还是配置权限 ...
- .net core 用grpc实现微服务
GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...
- android 学习JSON
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- NAS硬盘损坏拷贝时的处理办法及 UBUNTU下遍历删除某目录的方法
NAS突然挂了,说是硬盘坏了,我不信呀,换块上去先.原来的硬盘要经过一定的操作才能使用 官方给出的解决方案:我如何使用电脑来还原存储在 DiskStation 中的数据? 然后,你再拷贝到新的NAS中 ...
- jquery2源码分析系列
学习jquery的源码对于提高前端的能力很有帮助,下面的系列是我在网上看到的对jquery2的源码的分析.等有时间了好好研究下.我们知道jquery2开始就不支持IE6-8了,从jquery2的源码中 ...
- 自己开发一个 vsts agent 的 task
vsts 中支持自定义Build/Release的过程Task 目标:做一个可以读取 Xamarin.Android 所生成的 APK 的 基本信息的 task ,包括 package(包名) / a ...