python网络编程学习笔记(五):socket的一些补充


Posted in Python onJune 09, 2014

1、半开放socket

利用shutdown()函数使socket双向数据传输变为单向数据传输。shutdown()需要一个单独的参数,该参数表示了如何关闭socket。具体为:0表示禁止将来读;1
表示禁止将来写;2表示禁止将来读和写。

2、timeouts控制超时

调用socket的settimeout()函数,向其传递参数,表明超时时间设置。当访问一个socket,如果经过了参数设定的时间后,什么都没有发生,则会产生一个socket.timeout异常。
例如:当程序运行后,会等待数据传入。在另一终端,利用telnet连接12345端口。连接成功后,显示“连接来自:****”,如果此时5秒内,终端未进行输入,系
统会提示连接超时退出。

代码如下:

# -*- coding: cp936 -*-
##tcp响应服务器
import socket,traceback
host=''
port=12345
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(1)
while 1:
    try:
        clientsock,clientaddr=s.accept()
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()
        continue
    clientsock.settimeout(5)
    try:
        print "连接来自:",clientsock.getpeername()
        while 1:
            data=clientsock.recv(4096)
            if not len(data):
                break
            clientsock.sendall(data)
            clientsock.sendall("\nI get it!\n")
##            t=raw_input('input the word:')
##            clientsock.sendall(t)
    except (KeyboardInterrupt,SystemExit):
        raise
    except socket.timeout:
        print '连接超时'
        pass
    except:
        traceback.print_exc()
    try:
        clientsock.close()
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()

3、理解网络字节顺序

不同的平台有不同的二进制数据编码方法,为了解决这一总是,一种标准的二进制数据表示法,称为网络字节顺序。在发送一个二进制整数之前,该整数首先被
转换成网络字节顺序。接收方收到后,在使用该数据之前,会先把网络字节顺序转换成本地的表示方法。
python的struct模块提供了把数据在python和二进制数据之间转换的支持。
主要的两种基本格式:
H:适用于16位整数
I:适用于32位整数
惊叹号表示struct模块使用网络字节顺序来进行编码和解码。其它的格式见下表:

Character Byte order Size and alignment
@ native native            凑够4个字节
= native standard        按原字节数
little-endian standard        按原字节数
> big-endian standard       按原字节数
! network (= big-endian) standard       按原字节数

常用语句:

struct.pack(fmt,v1,v2,...)将v1,v2按参数格式进行转换。参数fmt是格式字符
串,这里主要是!I。v1,v2,...表示要转换的python值。
struct.unpack(fmt,string)与pack刚好相反。
例如:

>>> import struct
>>> a=20
>>> str=struct.pack("!I",a)
>>> print repr(str)
'\x00\x00\x00\x14'
>>> print struct.unpack("!I",str)
(20,)

Python 相关文章推荐
Python标准库sched模块使用指南
Jul 06 Python
Python使用matplotlib绘制余弦的散点图示例
Mar 14 Python
Python 将pdf转成图片的方法
Apr 23 Python
python中单下划线_的常见用法总结
Jul 10 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
基于Python实现人脸自动戴口罩系统
Feb 06 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
Python实现简单的猜单词
Jun 15 Python
Python OpenCV实现图像模板匹配详解
Apr 07 Python
python网络编程学习笔记(四):域名系统
Jun 09 #Python
python网络编程学习笔记(三):socket网络服务器
Jun 09 #Python
python网络编程学习笔记(二):socket建立网络客户端
Jun 09 #Python
python网络编程学习笔记(一)
Jun 09 #Python
有关wxpython pyqt内存占用问题分析
Jun 09 #Python
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 #Python
Python实例之wxpython中Frame使用方法
Jun 09 #Python
You might like
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
js的event详解。
2006/09/06 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
jquery 分页控件实现代码
2009/11/30 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
python音频处理的示例详解
2020/12/23 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
北京振戎融通Java面试题
2015/09/03 面试题
优秀学生事迹材料
2014/02/08 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
学习十八大演讲稿
2014/09/15 职场文书
爱国之歌(8首)
2019/09/29 职场文书
MySQL新手入门进阶语句汇总
2022/09/23 MySQL