• python网络编程【二】(使用TCP)


    1.建立socket

      对于一个客户端程序来说,建立一个socket需要两个步骤。首先,您需要建立一个实际的socket对象。其次,您需要把它连接到远程服务器上。

      在建立socket对象的时候,您需要告诉系统两件事:通信类型和协议家族。通信类型指明用什么协议来传输数据。协议的例子包括IPv4(当前的Internet标准),IPv6(将来的Internet标准),IPX/SPX(NetWare)和AFP(Apple文件共享)。到目前为止最通用的是IPv4。

      协议家族则定义数据如何被传输,通信类型基本上都是:AF_INET(和IPv4对应)。协议家族表示TCP通信的SOCK_STREAM和表示UDP通信的SOCK_DGRAM。

      对于TCP通信,建立一个socket连接,一般类似这样的代码:

      

    1 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      连接socket,您一般需要提供一个tuple(元组),它包含远程主机或ip地址和端口号。代码如下:

    1 s.connect(("www.baidu.com", 80))

    2.寻找端口号

      大多数才做系统都会附带一份端口号列表,Python的socket库包含一个getservbyname()的函数,它可以自动地查询。

      为了查询这个列表,您需要两个参数:协议名和端口号名。端口名是一个字符串,例如:http可以被转换为一个端口号。

     1 #!/usr/bin/env python
     2 import socket
     3 
     4 print "Creating socket....."
     5 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     6 print "done."
     7 
     8 print "Looking up port number..."
     9 port = socket.getservbyname('http','tcp')
    10 print "done."
    11 
    12 print "Connecting to remote host on port %d..." % port
    13 s.connect(("www.baidu.com",port))
    14 print "done."

    运行结果:

    3.从socket获取信息

      一旦建立了一个socket连接,您可以从他那里获取一些有用的信息:

     1 #!/usr/bin/env python
     2 import socket
     3 
     4 print "Creating socket....."
     5 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     6 print "done."
     7 
     8 print "Looking up port number..."
     9 port = socket.getservbyname('http','tcp')
    10 print "done."
    11 
    12 print "Connecting to remote host on port %d..." % port
    13 s.connect(("www.baidu.com",port))
    14 print "done."
    15 
    16 print "Connected from", s.getsockname()
    17 print "Connected to ", s.getpeername()

    运行结果:

    运行这个程序可以看到两条新的信息。第一条显示您本身的IP地址和端口号,第二条显示远程机器的 IP地址和端口号。对于客户端来说,端口号是由操作系统分配的,所以,您会发现每次运行程序时,端口号都不一样。

    4.利用socket通信

      python提供了两种方法:socket对象和文件类对象

      socket对象提供了操作系统的send(),sendto(),recv()和recvfrom()调用的接口。文件类对象提供了read(),write()和readline()这些更典型的python接口

    5.socket异常

      1.与一般I/O和通信问题有关的socket.error

      2.与查询地址信息有关的socket.gaierror

      3.与其他地址错误有关的socket.herror

      4.与在一个socket上调用settimeout()后,处理超时有关的socket.timeout(需要python2.3或更高版本)

  • 相关阅读:
    BZOJ 4236~4247 题解
    OCUI界面设计:滚动视图与分页控件初探
    大数乘法
    Effective C++ 11-17
    [Matlab+C/C++] 读写二进制文件
    Java 反射 方法调用
    如何使用LaTeX让自己不乱?
    LaTeX 相对于 Word 有什么优势?
    你在发表理科学术文章过程中有哪些经验值得借鉴?
    破译手势在对话中的意义
  • 原文地址:https://www.cnblogs.com/vipitsoft/p/5629517.html
Copyright © 2020-2023  润新知