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获取DLL和EXE文件版本号的方法
Mar 10 Python
初步认识Python中的列表与位运算符
Oct 12 Python
Python选课系统开发程序
Sep 02 Python
利用Python破解斗地主残局详解
Jun 30 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
Python并发:多线程与多进程的详解
Jan 24 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
python实现将range()函数生成的数字存储在一个列表中
Apr 02 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 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
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
2019/05/15 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
Python标准库defaultdict模块使用示例
2015/04/28 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
python进行参数传递的方法
2020/05/12 Python
Python 在函数上添加包装器
2020/07/28 Python
中间件分为哪几类
2016/09/18 面试题
小松树教学反思
2014/02/11 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫
Golang 对es的操作实例
2022/04/20 Golang