Python网络库介绍

    • Socket 对象简介
    • TCP 应用简介
    • HTTP 应用简介

Socket 对象简介

  • 创建 Socket
 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM 

socket.AF_INET 的含义和C的API的含义相同,即为协议类型选择,AF_INET为IPV4协议类型,还可以选择AF_INET6(IPV6)、AF_UNIX(本地IPC)。
socket.SOCK_STREAM,也是与C的API含义相同,即为数据流形式,在TCP中使用,UDP中使用 socket.SOCK_DGRAM,即为数据报的形式。

  • 绑定IP与端口
 s.bind(("", 12345))

的含义即为绑定IP与端口号,Bind的第一个参数为IP地址,填充内容为空则表示绑定所有网卡地址,Bind的第二个参数表示为监听端口。

  • 监听
s.listen(1)

即为启动监听,输入参数为限制的连接数量。

  • 接收连接
    s.accept()即为开始接收连接请求,该过程为阻塞过程。accept()返回的数据为一个元组,一共有两个返回值,其中第一个为连接的Socket对象,第二个为连接客户端的IP与端口。

    演示脚本:

    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)`
    s.bind(('', 12345))
    s.listen(1)
    print s.accept()
    >>>
    (0x0000000003260118>, ('127.0.0.1', 25447))
  • 接收数据
    s.recv(1024),即为接收传输数据,1024为最大的接收数量,该接口也为阻塞接口。返回值为数据。

    演示脚本:

    conn, cl = s.accept()
    while 1:
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)
    conn.close()

该示例为一个回声服务器。

  • 客户端连接与发送
    s.connect((HOST, PORT)),HOST中填充需要连接的目标IP,PORT填充需要连接的端口号。

    s.sendall("Hello,World!"),完成连接后,可以使用该指令进行数据传输。
    ==sendall==和==send==最大的区别在于send可以得到当前发送数据大小的返回值,而sendall会尝试发送所有需要传输的所有数据,如果发送成功,返回值为None,如果发送失败,则会抛出一个Exception,捕获可以得到异常信息。

  • 关闭连接
    s.close()

TCP 应用简介

  • 一个TCP服务器应用

    该应用完成了一个TCP服务端,支持多客户端连接,支持给指定客户端发送消息,支持给所有客户发送消息。

    
    # -*- coding: utf-8 -*-
    
    import socket
    import threading
    import SocketServer
    import time
    
    
    ## 消息回调函数
    
    def messageCallBack(message):
        print message;
    class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
        def setup(self):
            # 获取客户端的ip
            self.clientIp = self.client_address[0].strip()
            # 获取客户端的port
            self.clientPort = self.client_address[1]
            # 将连接的客户端保存在dict中
            self.server.client_request[self.client_address] = self.request
            msg = "new client " + (self.clientIp+":"+str(self.clientPort)+" is connect!")
            # 打印连接信息
            print msg
        def handle(self):
            # while循环
            while False==self.server.exit:
                data = self.request.recv(1024)
                # 判断是否接收到数据
                if data:
                    self.server.MessageCallBack(data)
                    cur_thread =threading.current_thread()
                # 若收到空数据,则退出循环
                else:
                    break;
                time.sleep(1);
        def finish(self):
            # 断开连接时删除对应的dict键
            del  self.server.client_request[self.client_address]
            # 打印退出信息
            print("client is disconnect! {}".format(self.client_address))
    
    class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
        def setMessageCallBack(self,MessageCallBack):
            self.client_request = {}
            self.MessageCallBack = MessageCallBack;
            self.exit=False;
        pass
    
    ## TCP 服务类
    
    class TcpServer:
        ## 构造
        def __init__(self,ip,port,MessageCallBack):
            self.ip = ip
            self.port = port
            self.fMessageCallBack = MessageCallBack
        ## 开启服务
        def StartServer(self):
            HOST, PORT = self.ip, self.port
            self.server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
            self.server.setMessageCallBack(self.fMessageCallBack)
            self.server.allow_reuse_address=True;
            self.server.exit=False;
            print self.server
            ip, port = self.server.server_address
            server_thread = threading.Thread(target=self.server.serve_forever)
            server_thread.daemon = True
            server_thread.start()
            print "Server loop running in thread:", server_thread.name
        ## 发送消息给所有客户端
        def SendMessageToAllClient(self,message):
            for request in self.server.client_request.values():
                request.sendall(message)
        ## 发送消息给指定客户端
        def SendMessageToDstClient(self,ip,port,message):
            for clientAddr in self.server.client_request.keys():
                if(clientAddr[0] == ip and clientAddr[1] == port):
                    self.server.client_request[clientAddr].sendall(message)
        ## 停止服务
        def StopServer(self):
            self.server.exit=True;
            self.server.shutdown()
            for request in self.server.client_request.values():
                request.close()
            self.server.socket.close();
    
    ##  for test function
    
    
    ##  if __name__ == '__main__':
    
    
    ##    myServer = TcpServer(8045,messageCallBack);
    
    
    ##    myServer.StartServer();
    
    
    ##    time.sleep(10)
    
    
    ##    myServer.StopServer();
    

HTTP 应用简介

  • HTTP 封装示例
    该应用完成了Http的Get操作与Post操作的封装。

    
    
    # -*- coding: utf-8 -*-
    
    import sys
    import os
    import socket
    import httplib
    
    def HttpGetOutput(host,url,message,timeSecond):
        try:
            http_client=httplib.HTTPConnection(str(host),timeout=timeSecond)
            headers = {"Content-type": "application/json"}
            http_client.request('GET',url,message,headers)
            r=http_client.getresponse()
            return r.read()
        except Exception,e:
            print 'http get error.'+str(e)
            pass
        return ""
    
    def HttpPostOutput(host,url,message,timeSecond):
        try:
            http_client=httplib.HTTPConnection(str(host),timeout=timeSecond)
            headers = {"Content-type": "application/json"}
            http_client.request('POST',url,message,headers)
            r=http_client.getresponse()
            return r.read()
        except Exception,e:
            print 'http post error.'+str(e)
            pass
        return ""

你可能感兴趣的:(Python网络库介绍)