python网络编程学习笔记(二):socket建立网络客户端


Posted in Python onJune 09, 2014

1、建立socket

建立socket对象需要搞清通信类型和协议家族。通信类型指明了用什么协议来传输数据。协议的例子包括IPv4、IPv6、IPX\SPX、AFP。对于internet通信,通信类型基本上都是AF_INET(和IPv4对应)。协议家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM。因此对于TCP通信,建立一个socket连接的语句为:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
对于UDP通信,建立一个socket连接的语句为:
s=socket.socket(socket.AF_INET,SOCK_DGRAM)

2、连接socket

连接socket需要提供一个tuple,包括host(主机名或者IP)和port(远程端口),类似代码为:
s.connect(("www.baidu.com",80)

3、寻找端口号

socket库中利用getservbyname()函数可以查询端口号,一般需要两个参数:一是协议名,如http、smtp、pop3等,一个是端口名,如tcp、udp

例如:

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port=socket.getservbyname('http','tcp')
port的返回值为80。若改为:
port=socket.getservbyname('smtp','tcp')
port的返回值为25。

4、从socket获取信息

建立socket连接后,可以通过getsockname()获取本身的ip地址和端口号,也可以通过getpeername()显示远程机器的ip地址和端口号。
如:在python shell中

>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> port=socket.getservbyname('http','tcp')
>>> s.connect(('www.baidu.com',port))
>>> print s.getsockname()
('192.168.87.138', 3213)
>>> print s.getpeername()
('220.181.111.147', 80)

Socket 模块的类方法
类方法 说明
Socket 低层网络接口(每个 BSD API)
socket.socket(family, type) 创建并返回一个新的 socket 对象
socket.getfqdn(name) 将使用点号分隔的 IP 地址字符串转换成一个完整的域名
socket.gethostbyname(hostname) 将主机名解析为一个使用点号分隔的 IP 地址字符串
socket.fromfd(fd, family, type) 从现有的文件描述符创建一个 socket 对象

Socket 模块的实例方法

实例方法 说明
sock.bind( (adrs, port) ) 将 socket 绑定到一个地址和端口上
sock.accept() 返回一个客户机 socket(带有客户机端的地址信息)
sock.listen(backlog) 将 socket 设置成监听模式,能够监听 backlog 外来的连接请求
sock.connect( (adrs, port) ) 将 socket 连接到定义的主机和端口上
sock.recv( buflen[, flags] ) 从 socket 中接收数据,最多 buflen 个字符
sock.recvfrom( buflen[, flags] ) 从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号
sock.send( data[, flags] ) 通过 socket 发送数据
sock.sendto( data[, flags], addr ) 通过 socket 发送数据
sock.close() 关闭 socket
sock.getsockopt( lvl, optname ) 获得指定 socket 选项的值
sock.setsockopt( lvl, optname, val ) 设置指定 socket 选项的值

举例:
>>> import socket
>>> socket.gethostbyname('www.baidu.com')
'220.181.111.147'
>>> socket.gethostbyname('www.126.com')
'123.125.50.22'
>>> socket.getfqdn('123.125.50.22')
'123.125.50.22'
这里getfqdn却不能返回域名?

5、处理错误
关于错误异常的处理,主要就是用try、except语句。如将python网络编程学习笔记(1)中gopherclient.py进行一下修改:

# -*- coding: cp936 -*-
##modify by 小五义
import socket,sys
port =70
host=sys.argv[1]
filename=sys.argv[2]
try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except Socket.error,e:
    print "建立socket错误:%s"%e
try:
    s.connect((host,port))
except socket.gaierror,e:
    print "host或者端口错误:%s" %e
except socket.error,e:
    print "连接错误:%s" %e
try:
    s.sendall(filename+"\r\n")
except socket.error,e:
    print "数据发送错误:%s" %e
    sys.exit(1)

while 1:
    try:
        buf=s.recv(2048)
    except socket.error,e:
        print "接收错误:%s"%e
        sys.exit(1)
    if 'does not exist' in buf:
        print "%s文件不存在" %filename
    else:
        if not len(buf):
            break
        sys.stdout.write(buf)

运行结果是:

C:\>python gopherclient.py quux.org/ wh.txt
连接错误:[Errno 10060]
数据发送错误:[Errno 10057] 由于套接字没有连接并且(当
据报套接字时)

C:\>python gopherclient.py quux.org wh.txt
wh.txt文件不存在

=======================================================================================================================
对python网络编程学习笔记(1)的添加
笔记1中在dos下运行python gopherclient.py quux.org系统提示出错的问题,终于明白了。错误原因是少了文件名。如在quux.org/有whatsnew.txt,于是在dos下运行python gopherclient.py quux.org whatsnew.txt。这时会将whatsnew.txt的内容全部列出。

Python 相关文章推荐
Python中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
解决python运行启动报错问题
Jun 01 Python
python如何保存文本文件
Jun 07 Python
python网络编程学习笔记(一)
Jun 09 #Python
有关wxpython pyqt内存占用问题分析
Jun 09 #Python
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 #Python
Python实例之wxpython中Frame使用方法
Jun 09 #Python
wxpython学习笔记(推荐查看)
Jun 09 #Python
wxPython中文教程入门实例
Jun 09 #Python
python操作xml文件详细介绍
Jun 09 #Python
You might like
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
php提示undefined index的几种解决方法
2012/05/21 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
2014/05/11 Javascript
Javascript实现计算个人所得税
2015/05/10 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
django解决跨域请求的问题详解
2019/01/20 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
python实现动态创建类的方法分析
2019/06/25 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Python实现动态循环输出文字功能
2020/05/07 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
教师网络培训心得体会
2016/01/09 职场文书
Mysql数据库命令大全
2021/05/26 MySQL