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版的文曲星猜数字游戏代码
Sep 02 Python
Python程序设计入门(1)基本语法简介
Jun 13 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
浅析python实现scrapy定时执行爬虫
Mar 04 Python
详解Python中的正则表达式
Jul 08 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
python Web flask 视图内容和模板实现代码
Aug 23 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
Nov 29 Python
python实现坦克大战
Apr 24 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
php将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
numpy返回array中元素的index方法
2018/06/27 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
tensorflow如何批量读取图片
2019/08/29 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python解析多层json操作示例
2019/12/30 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
python实现mean-shift聚类算法
2020/06/10 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
高分子材料与工程专业推荐信
2013/12/01 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
团代会主持词
2014/04/02 职场文书
信息员培训方案
2014/06/12 职场文书
企业法人任命书
2015/09/21 职场文书
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS