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测试驱动开发实例
Oct 08 Python
Python配置文件解析模块ConfigParser使用实例
Apr 13 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
分析python切片原理和方法
Dec 19 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
Selenium的使用详解
Oct 19 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
Python猴子补丁知识点总结
Jan 05 Python
解决python的空格和tab混淆而报错的问题
Feb 26 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 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
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
PHP对象相关知识总结
2017/04/09 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
对vux点击事件的优化详解
2018/08/28 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
python基础教程之循环介绍
2014/08/29 Python
详解Python中for循环的使用
2015/04/14 Python
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
Python实现的选择排序算法示例
2017/11/29 Python
tensorflow获取变量维度信息
2018/03/10 Python
对python中的logger模块全面讲解
2018/04/28 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python将视频转换为全字符视频
2019/04/26 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
重点工程汇报材料
2014/08/27 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
销售督导岗位职责
2015/04/10 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript