冰冻三尺非一日之寒-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 ...
随机推荐
- OC 观察者模式(通知中心,KVO)
OC 观察者模式(通知中心,KVO) 什么是观察者模式??? A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化.这就是观察者模式. 观察者模式定义了一种一对多的依赖关系, ...
- 深入浅出React Native 1: 环境配置
该教程主要介绍如何用react native来开发iOS,所以首先,你需要有一台mac,当然黑苹果也是可以的~ 创建一个react native的项目只需要安装以下五个组件~~(但....坑爹的是,不 ...
- android 内存溢出与内存泄露
内存溢出就是软件运行需要的内存,超出了java虚拟机给他分配的可用的最大内存 内存泄露就是在缓存图片文字等等的时候,没有关闭流所导致的内存泄露
- Ubuntu14.04 Django Mysql安装部署全过程
Ubuntu14.04 Django Mysql安装部署全过程 一.简要步骤.(阿里云Ubuntu14.04) Python安装 Django Mysql的安装与配置 记录一下我的部署过程,也方便 ...
- 通过VLD扩展分析PHP opcode
安装VLD扩展 ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld 生成脚本opcode > p ...
- Java:Remote Debug
Java Remote Debug -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,add ...
- .NET笔记(二)
null合并运算符 ?? 运算符称作null 合并运算符.如果此运算符的左操作数不为null,则此运算符将返回左操作数:否则返回右操作数. 使用Average而产生的一个错误 因为数据中有DBNull ...
- Ubuntu下Apache+SVN+submin实现WEB管理SVN
为什么需要submin管理SVN? 原来在Ubuntu下,都是直接通过命令行创建SVN仓库并分配权限,但是这有一些问题: 每创建一个SVN仓库,都需要修改httpd.conf 每创建一个帐户,都需要手 ...
- jQuery 3.0 的 setter/getter 模式
jQuery 的 setter/getter 共用一个函数,通过是否传参来表明它是何种意义.简单说传参它是 setter,不传它是 getter. 一个函数具有多种意义在编程语言中并不罕见,比如函数重 ...
- Entity Framework 6 with MySql
MySQL Connector/Net 6.8.x MySQL Server 5.1 or above Entity Framework 6 assemblies .NET Framework ...