本篇博客将继续学习Python,这篇文章将继续讲解python的核心网络库,Python中socket的使用

(一)今天我们首先学习的通过给定一个端口号和协议,发现服务的名字。

    如果你想要发现网络的一些服务,你能够帮助决定在哪个端口下运行的哪一个网络服务,该服务是使用TCP 协议还是使用UDP协议。

    如果你知道一个网络服务的端口号,你就能够使用从socket库中的socket类函数getservbyport()来获得服务的名字。当调用这个函数时,你能够随意的给出这个协议的名字。

    下面我将讲解该如何去做,需要首先定义一个find_service_name()函数,在这个函数中,我们使用一些端口号,想80,25,通过调用socket类函数getservbyport()来获取服务的名字。这里使用了Python的for-in 循环结构。

     

#! /usr/bin/env python 
#coding:utf-8
#please support shuaigexiaobo

import socket

def find_service_name():
    protocolname = 'tcp'
    for port in [80,25]:
        print "port : %s =>service name : %s" %(port,socket.getservbyport(port,protocolname))
    print "port : %s =>service name : %s" %(53,socket.getservbyport(53,'udp'))
	
if __name__ =='__main__':
    find_service_name()


    上述脚本运行结果为:

python 獲取 HIK服務 名稱_python

 

 (二)下面我们将学习将整数转化为主机序列以及字节序列

    如果你曾经需要写一些低层次网络应用,你可能需要处理在两个机器之间通信线路的数据传输。这个操作需要从本地主机操作系统到网络格式上进行数据格式的转换,在接收端反之亦然。

    Python的socket库中提供从网络字节序列转化为主机字节序列工具包,反之亦然。你可能需要对他们很熟悉,例如ntoh1()或者hton1()。

    让我们定义一个convert_integer()方法,使用ntoh1()和hton1()这两个socket类方法进行IP地址格式转换。

    

#! /usr/bin/env python 
#coding:utf-8
#please support shuaigexiaobo

import socket
def convert_integer():
    data = 1234
    #32bit
    print "Original:%s=>Long host byte order:%s,Network byte order:%s"\
    %(data,socket.ntohl(data),socket.htonl(data))
    #16bit
    print "Original:%s=>Short host byte order:%s,Network byte order:%s"\
    %(data,socket.ntohs(data),socket.htons(data))
if __name__ =='__main__':
    convert_integer()


IndentationError: unexpected indent错误

  都知道python是对格式要求很严格的,写了一些python但是也没发现他严格在哪里,今天遇到了IndentationError: unexpected indent错误我才知道他是多么的严格。 
    以后遇到了IndentationError: unexpected indent你就要知道python编译器是在告诉你“Hi,老兄,你的文件里格式不对了,可能是tab和空格没对齐的问题,你需要检查下tab和空格了”。 

    解决:将文件里面的tab全部换成空格对齐,最终出现如下结果:

python 獲取 HIK服務 名稱_python_02

    在上面的程序中,我们给了一个整数数字,并且展示了如何将这个整数的数字转化为主机序列以及转换为网络序列。socket类函数ntohl()中将网络字节序列转换为一个长格式的主机字节序列。在这里n代表网络(Network),h代表主机(Host),l代表长32bit,s代表短16bit。

 

(三)今天将要学习的第三个内容是设置以及取出默认的socket超时属性(timeout)。

     有些时候,你需要处理socket库中某个默认属性的值,例如,socket超时属性。

     我们需要创建一个socket对象的实例,调用gettimeout()方法来获得默认的超时属性值,调用setttimeout()方法设置一个确定的超时属性值。这些方法在开发一个定制的服务应用是非常有用的。

    我们首先在test_timeout方法中创建一个socket对象,之后,我们可以使用getter/setter实例方法处理超时属性值。

   

#! /usr/bin/env python 
#coding:utf-8
#please support shuaigexiaobo

import socket
def test_timeout():
    s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    print "Default socket timeout:%s" %s.gettimeout()
    s.settimeout(100)
    print "Current socket timeout:%s" %s.gettimeout()

if __name__ =='__main__':
    test_timeout()


    在运行上面的脚本,你能够发现默认的超时属性值是如何被修改的。结果如下所示:

   

python 獲取 HIK服務 名稱_python_03

    在这个编码小程序中,我们首先创造了一个socket对象,传递了两个参数作为socket构造函数的参数,第一个参数是socket 家族(family),第二个参数是socket类型(type)。之后,我们能够通过调用gettimeout()来获取socket的超时属性值,之后通过调用settimeout()方法改变socket的超时属性值,该方法的参数可以是none,或者是非负浮点数类型。这个方法用来操作阻塞套接字操作。在socket操作中,设置一个值为none的超时(timeout)禁用超时。