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实现代理服务功能实例
Nov 15 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
python Timer 类使用介绍
Dec 28 Python
关于Numpy之repeat、tile的用法总结
Jun 02 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 带逗号千位符数字的处理方法
2012/01/10 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
一则python3的简单爬虫代码
2014/05/26 Python
python实现飞机大战
2018/09/11 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
python生成并处理uuid的实现方式
2020/03/03 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
毕业生找工作的自我评价
2013/10/18 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
追讨欠款律师函
2015/05/27 职场文书
法律讲堂观后感
2015/06/11 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
python实现简易名片管理系统
2021/04/11 Python
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
Redis基本数据类型String常用操作命令
2022/06/01 Redis