python网络编程学习笔记(二):socket建立网络客户端

 更新时间:2014年06月09日 21:40:13   作者:  
看了这一节,突然之间对python网络编程学习笔记(1)中的一些不理解的问题有了认识,至少明白了socket是怎么回事。这里关于socket的起源等问题就不做笔记记录了,直接进入主题

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的内容全部列出。

相关文章

  • 如何查看Django ORM执行的SQL语句的实现

    如何查看Django ORM执行的SQL语句的实现

    这篇文章主要介绍了如何查看Django ORM执行的SQL语句的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Union在Python类型注解中的应用与最佳实践

    Union在Python类型注解中的应用与最佳实践

    Union” 在中文中通常翻译为“联合”,在数学和逻辑学中,它指的是两个或多个集合的并集,在 Python 的类型注解中,Union 类型表示一个变量可以是多种类型中的任意一种,这与数学中的并集概念相似,本文介绍了Union在Python类型注解中的应用与最佳实践
    2024-09-09
  • 浅析Python中变量用法

    浅析Python中变量用法

    在Python编程语言中,变量是用于存储数据值的标识符,它们可以用来引用数据值,而不是直接使用值本身,本文将详细介绍python中的变量,感兴趣的同学可以参考阅读
    2023-05-05
  • python检查指定文件是否存在的方法

    python检查指定文件是否存在的方法

    这篇文章主要介绍了python检查指定文件是否存在的方法,涉及Python基于os模块判定文件的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • Python魔法方法功能与用法简介

    Python魔法方法功能与用法简介

    这篇文章主要介绍了Python魔法方法功能与用法,结合具体实例形式分析了Python面向对象程序设计中魔法方法的概念、功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-04-04
  • python制作最美应用的爬虫

    python制作最美应用的爬虫

    这篇文章主要介绍了python制作最美应用的爬虫的相关资料,需要的朋友可以参考下
    2015-10-10
  • Python2.x中文乱码问题解决方法

    Python2.x中文乱码问题解决方法

    这篇文章主要介绍了Python2.x中文乱码问题解决方法,本文解释问题原因、给出了处理办法并讲解了编码解码的一些知识,需要的朋友可以参考下
    2015-06-06
  • pytest参数化:@pytest.mark.parametrize详解

    pytest参数化:@pytest.mark.parametrize详解

    pytest.mark.parametrize装饰器能够对测试函数进行参数化处理,使得一个测试函数可以用多组数据执行多次,这有助于检查不同输入下的期望输出是否匹配,提高测试的效率和覆盖率,装饰器可以应用于函数、模块或类,支持多个装饰器组合使用,增强测试的灵活性和综合性
    2024-10-10
  • python计算机视觉opencv矩形轮廓顶点位置确定

    python计算机视觉opencv矩形轮廓顶点位置确定

    这篇文章主要为大家介绍了python计算机视觉opencv矩形轮廓顶点位置确定,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 教你使用Python获取QQ音乐某个歌手的歌单

    教你使用Python获取QQ音乐某个歌手的歌单

    这篇文章主要介绍了Python获取QQ音乐某个歌手的歌单,从qq音乐中获取某个你喜欢的歌手的清单,涉及到的库有requests、json,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论