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 GAE、Django导出Excel的方法
Nov 24 Python
python列表操作使用示例分享
Feb 21 Python
python脚本实现查找webshell的方法
Jul 31 Python
Python中列表、字典、元组、集合数据结构整理
Nov 20 Python
python获取远程图片大小和尺寸的方法
Mar 26 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python 解决函数返回return的问题
Dec 05 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 preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
Python中set与frozenset方法和区别详解
2016/05/23 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
python绘制双柱形图代码实例
2017/12/14 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
python实现多线程端口扫描
2019/08/31 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
详解px单位html5响应式方案
2018/03/08 HTML / CSS
财务总经理岗位职责
2014/02/16 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
法制宣传标语集锦
2014/06/25 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
优秀团支部申报材料
2014/12/26 职场文书
检讨书范文1000字
2015/01/28 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
微信小程序调用python模型
2022/04/21 Python