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 相关文章推荐
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
Python网络编程 Python套接字编程
Sep 13 Python
Python实现全排列的打印
Aug 18 Python
python os.path模块常用方法实例详解
Sep 16 Python
Python3中bytes类型转换为str类型
Sep 27 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
django ORM之values和annotate使用详解
May 19 Python
pycharm sciview的图片另存为操作
Jun 01 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
2021年最新用于图像处理的Python库总结
Jun 15 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
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
十天学会php之第六天
2006/10/09 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
php生成短域名函数
2015/03/23 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
初步解析Python下的多进程编程
2015/04/28 Python
django做form表单的数据验证过程详解
2019/07/26 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
农药学硕士毕业生自荐信
2013/09/25 职场文书
办公室保洁员岗位职责
2013/12/02 职场文书
车间组长岗位职责
2013/12/20 职场文书
施工资料员岗位职责
2014/01/06 职场文书
工程安全员岗位职责
2014/03/09 职场文书
反邪教观后感
2015/06/11 职场文书
MySQL基础(二)
2021/04/05 MySQL
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
Django基础CBV装饰器和中间件
2022/03/22 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python