zoukankan      html  css  js  c++  java
  • 《python核心编程》读书笔记--第16章 网络编程

    在进行网络编程之前,先对网络以及互联网协议做一个了解。

    推荐阮一峰的博客:(感谢)

    http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

    --再去看一遍先--

    --看完了--

    16.1引言

    客户端、服务器架构

    服务器是一个软件或者硬件,用来想一个或多个客户端提供所需要的“服务”。其中,硬件是指打印机、文件服务器等。软件服务器提供的服务主要是程序的运行、数据的发送与接收、合并、升级、或其他的程序或数据操作。软件服务器有Web服务器、数据库服务器、窗口服务器等。

    对于服务器而言,在提供服务之前需要进行一些设置。先要创建一个通讯端点,让服务器能够“监听”请求,然后需要将统一资源定位符(URL)在网络上广而告之,然后就可以提供服务了。

    16.2套接字:通讯端点

    1、什么是套接字

    源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。是一种具有“通讯端点”概念的计算机网络数据结构。

    套接字可以分为基于文件型和基于网络型。基于文件型的用来处理同一台主机上的程序(文件)之间的通讯。而网络型就是来处理网络之间的通讯的。

    2、套接字地址:主机与端口

    一个因特网地址由网络通讯所必需的主机与端口组成。合法的端口范围为0-65535,小于1024的用来作为系统端口,所以自己定义的(应用软件)端口只能是大于1024的。常用的端口号列表:http://www.iana.org/assignments/port-numbers

    3、面向连接与无连接

    套接字的类型只有两种:面向连接和无连接。

    面向连接:也称“流套接字”(SOCK_STREAM)。在通讯之前先建立连接。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。

    无连接:即无需建立连接就进行通讯。就像邮政服务一样,数据的发送顺序和接收顺序关系不大,并且可能还收不到(中国邮政?)。那么,它的优点是没有建立连接的资源消耗。实现这种连接的是用户数据报协议(UDP)(SOCK_DGRAM)。

    上面两种套接字使用网际协议(IP)来查找网络中的主机,这样形成的系统有两个协议组合来描述,TCP/IP和UDP/IP。

    16.3Python中的网络编程

    主要是stock模块的应用。

    写一段TCP协议代码。

    服务器端:

    #-*- coding:utf-8 -*-
    from socket import *
    from time import ctime
    
    HOST = ''
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST,PORT)
    
    #首先是创建套接字对象
    tcpSerSock = socket(AF_INET,SOCK_STREAM) 
    tcpSerSock.bind(ADDR)
    tcpSerSock.listen(5) #最多有多少个连接同时接进来
    
    while True:
        print 'wating for connection...'
        tcpCliSock,addr = tcpSerSock.accept()
        print '...connected from:',addr
    
        while True:
            data = tcpCliSock.recv(BUFSIZ)
            if not data:
                break
            tcpCliSock.send('[%s] %s' % (ctime(),data))
        tcpCliSock.close()
    
    tcpSerSock.close()

    客户端:

    #-*- coding:utf-8 -*-
    from socket import *
    import time
    
    HOST = "localhost"
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST,PORT)
    
    tcpCliSock = socket(AF_INET,SOCK_STREAM)
    tcpCliSock.connect(ADDR)
    
    while True:
        data = 'hepeng'
    
        if not data:
            break
        tcpCliSock.send(data)
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        print data
        time.sleep(10)
    
    tcpCliSock.close()

    16.4 SocketServer模块

    SocketServer 是标准库中一个高级别的模块。用于简化实现网络客户端与服务器所心需的大量样板代码。该模块中,已经实现了一些可供使用的类。

    服务器端:

    #-*- coding:utf-8 -*-
    from SocketServer import (TCPServer as TCP,StreamRequestHandler as SRH)
    from time import ctime
    
    HOST = ''
    PORT = 21567
    ADDR = (HOST,PORT)
    #print dir(SRH)  #看一下有哪些属性和方法
    class MyReqyestHandler(SRH):
        """docstring for MyReqyestHandler"""
        def handle(self):
            print '...connected from:',self.client_address
            self.wfile.write('[%s] %s' % (ctime(),self.rfile.readline()))
    
    tcpServ = TCP(ADDR,MyReqyestHandler)
    print 'waiting for connection...'
    tcpServ.serve_forever()

    客户端:

    #-*- coding:utf-8 -*-
    
    from socket import *
    import time
    
    HOST = "localhost"
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST,PORT)
    #注意这里的处理方式与前面的不同了,每次都需要进行新的socket对象定义,这样就是每次循环都会再与服务器连接一次
    while True:
        tcpCliSock = socket(AF_INET,SOCK_STREAM)
        tcpCliSock.connect(ADDR)
        data = 'hepeng'
    
        if not data:
            break
        tcpCliSock.send('%s
    ' % data) #我们使用的处理器类像文件一样操作套接字,所以我们每次都要发送行结束字符(回车与换行〉
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        print data.strip()
        time.sleep(10)
        tcpCliSock.close()

    16.5 Twisted框架

    Twisted 是一个完全事件驱动的网络框架。它允许你使用和开发完全异步的网络应用程序和协议。它为你创建一个完整系统提供了很大的帮助。系统中可以有:网络协议、线程、安全和认证、聊天/即时通讯、数据库管理、关系数据库集成、Wed/Internet、电子邮件、命令行参数、图形界面集成等。

    推荐博客:

    http://blog.sina.com.cn/s/blog_704b6af70100py9f.html

  • 相关阅读:
    (转)卡特兰数
    fatal error LNK1123: 转换到 COFF 期间失败
    cocos2dx 中文乱码问题
    c++ primer查漏补缺(一)命名空间
    Centos 7 二进制部署高可用Kubernetes v1.17.x
    hostAliases给pod增加域名解析
    常用的清理 Kubernetes 集群资源命令
    Kubernets 污点与容忍
    Docker 常用命令大全
    Kubernets健康检查——配置存活、就绪和启动探测器
  • 原文地址:https://www.cnblogs.com/batteryhp/p/5211268.html
Copyright © 2011-2022 走看看