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完全新手教程
Feb 08 Python
python中模块查找的原理与方法详解
Aug 11 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
Python3基于sax解析xml操作示例
May 22 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Jupyter Notebook折叠输出的内容实例
Apr 22 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
Python之京东商品秒杀的实现示例
Jan 06 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 feof用来识别文件末尾字符的方法
2010/08/01 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Python 高级专用类方法的实例详解
2017/09/11 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
一文读懂Python 枚举
2020/08/25 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
HTML5 canvas 基本语法
2009/08/26 HTML / CSS
我的五年职业生涯规划
2014/01/23 职场文书
个人贷款承诺书
2014/03/28 职场文书
婚前协议书怎么写
2014/04/15 职场文书
公关活动策划方案
2014/05/25 职场文书
大专生求职信
2014/06/29 职场文书
国际贸易系求职信
2014/08/09 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
高校教师个人总结
2015/02/10 职场文书