冰冻三尺非一日之寒-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 ...
随机推荐
- 【Swift 2.1】为 UIView 添加点击事件和点击效果
前言 UIView 不像 UIButton 加了点击事件就会有点击效果,体验要差不少,这里分别通过自定义和扩展来实现类似 UIButton 的效果. 声明 欢迎转载,但请保留文章原始出处:) 博客园: ...
- android 音乐播放器
本章以音乐播放器为载体,介绍android开发中,通知模式Notification应用.主要涉及知识点Notification,seekbar,service. 1.功能需求 完善音乐播放器 有播放列 ...
- iOS开发之功能模块--模糊效果
1.先介绍一个好用的实现模糊效果的框架:https://github.com/YouXianMing/UIImageBlur 2.iOS8 中 UIVisualEffectView 模糊效果的使用 , ...
- Java和WebSocket开发网页聊天室
小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...
- jQuery插件库代码分享 - 进阶者系列 - 学习者系列文章
这些天将原来在网上找的jQuery插件进行了下整理,特此将代码分享出来给大家. 见下图结构. 对目录结构进行了分类.这里是插件列表. 这里总共收集了20来个插件.还有下面未进行划分的. 下面是DEMO ...
- yum安装mysql和mysql源,配置mysql
申明,不要用root安装 1. 下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm ...
- 一个C语言问题
在这个题目中,你需要编写一个c++程序,要求输出以下内容:000000010010.....11101111(输出0到31的每个数的二进制表示,每行一个,前面的0也必须输出!) 1)部分代码已经为你完 ...
- PostgreSQL-constraint
CREATE TABLE语法CREATE [[ GLOBAL | LOCAL ]{ TEMPORARY | TEMP }] TABLE table_name ({ column_name data_t ...
- 微信浏览器的HTTP_USER_AGENT
在iPhone下,返回 1 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, lik ...
- 数据处理之PostgreSQL过程语言学习
前段时间,公司更换新的PostgreSQL数据集市的系统过程中,自己下载了postgresqlAPI的pdf文件研究了一下PostgreSQL数据集市.发现使用PostgreSQL过程语言可以大大加快 ...