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中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
python编写计算器功能
Oct 25 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
Python解析多帧dicom数据详解
Jan 13 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
Python绘图之柱形图绘制详解
Jul 28 Python
Python如何执行精确的浮点数运算
Jul 31 Python
python爬虫使用scrapy注意事项
Nov 23 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
PHP编实现程动态图像的创建代码
2008/09/28 PHP
php 动态添加记录
2009/03/10 PHP
PHP HTML代码串 截取实现代码
2009/06/29 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
JS 实现完美include载入实现代码
2010/08/05 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
python类定义的讲解
2013/11/01 Python
详解Python中的__init__和__new__
2014/03/12 Python
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
大型主题婚礼活动策划方案
2014/09/15 职场文书
党员个人自我评价
2015/03/03 职场文书
纪委立案决定书
2015/06/24 职场文书
女性健康讲座主持词
2015/07/04 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
Python jiaba库的使用详解
2021/11/23 Python