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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
浅要分析Python程序与C程序的结合使用
Apr 07 Python
Python实现提取谷歌音乐搜索结果的方法
Jul 10 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
Python 中的Selenium异常处理实例代码
May 03 Python
selenium+python截图不成功的解决方法
Jan 30 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
Apr 23 Python
python中使用input()函数获取用户输入值方式
May 03 Python
python将图片转为矢量图的方法步骤
Mar 30 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
在Python中使用元类的教程
2015/04/28 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
PHP两种查询函数array/row的区别
2013/06/03 面试题
汽车队司机先进事迹材料
2014/02/01 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
公司委托书格式范文
2014/10/09 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
奔腾年代观后感
2015/06/09 职场文书
python使用shell脚本创建kafka连接器
2022/04/29 Python