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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
Python中的集合类型知识讲解
Aug 19 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 Python
Python使用sorted排序的方法小结
Jul 28 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
Python是什么 Python的用处
May 26 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 Python
Python使用pyenv实现多环境管理
Feb 05 Python
python链表类中获取元素实例方法
Feb 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
我的论坛源代码(三)
2006/10/09 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
基于php权限分配的实现代码
2013/04/28 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
php验证手机号码
2015/11/11 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
Python中print和return的作用及区别解析
2019/05/05 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
pandas参数设置的实用小技巧
2020/08/23 Python
北京振戎融通Java面试题
2015/09/03 面试题
团拜会策划方案
2014/06/07 职场文书
建议书格式
2015/02/04 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL