zoukankan      html  css  js  c++  java
  • 23 Apr 18 基于UDP协议通信的套接字 进程

    23 Apr 18
    一、基于TCP协议的套接字通信(无并发效果)
    #阻塞: 程序停住了
    服务端:
    import socket
     
    server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind(('127.0.0.1',8080))
    server.listen(5)  # listen接收客户端发来的连接请求
     
    while True:
        conn,client_addr=server.accept()
        print(client_addr)
     
        while True:
            try:
                data=conn.recv(1024)
                if not data:break # 针对linux系统
                conn.send(data.upper())
            except ConnectionResetError:  #linux系统在单方面关闭连接时不会报ConnectionResetError(windows系统),会receive空
                break
        conn.close()
     
    server.close()
    客户端:
    import socket
     
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect(('127.0.0.1',8080))
     
    while True:
        msg=input('>>>: ').strip()
        if not msg:continue
        client.send(msg.encode('utf-8'))
        data=client.recv(1024)
        print(data.decode('utf-8'))
     
    client.close()
     
    二、基于UDP协议通信的套接字
    TCP(流式协议):可靠性高。会因为网络原因丢包,但只有在一端收到另一端发来的ack确认信息才会将信息在内存中删除,如果发现丢包(一段时间内没有回复)会将信息再发一份。TCP会存在粘包问题,收与发可以不是对应的。必须先启动服务端,否则报错。
    UDP(数据包协议):可靠性低。信息一旦发出即在内存中删除,如果发生丢包,信息即丢失。UDP效率高速度快的主要原因,一是因为不建连接,二是因为接受后不会确认。 UDP没有粘包问题,收与发一一对应。 如果发hello,但收一个字符,在windows系统中会报错;在linunx系统中不报错,只接收h。
    并行:(真正意义上的)同时运行;并行属于并发
    并发: 看起来是同时运行就可以了
     
    服务端:
    import socket
     
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议
    server.bind(('127.0.0.1',8080))
     
    while True:
    client_data,client_addr=server.recvfrom(1024)
    #保持UDP稳定(丢包少)的最大接受字节为512,所以这里一般设为1024
        print(client_data)
        msg=input('回复%s:%s>>>:' %(client_addr[0],client_addr[1]))
    server.sendto(msg.encode('utf-8'),client_addr)
     
    客户端:
    import socket
     
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议
     
    while True:
        msg=input('>>>: ').strip()
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
        res,server_addr=client.recvfrom(1024)
        print(res.decode('utf-8'))
    #因为UDP不需提前建连接,不用等到一个客户端退出后另一个才能交互;几个客户端都可以和服务端交互。服务端还是一个个服务,但因为处理速度快,会给用户一种并发的感觉。
     
    URL地址: http://www.cnblogs.com/linhaifeng/articles/6817679.html
    http: #浏览器(客户端套接字)使用的协议
    www.cnblogs.com             #域名
    www.cnblogs.com:80         #省略:80,80为端口,一般服务端端口默认为80
    linhaifeng/articles/6817679.html  #路径
     
    DHCP服务器: 每台电脑自带的,用来配IP,其端口默认67
    DNS服务器: 每台电脑自带的, 用来将域名转成IP,其默认端口53
     
    用浏览器访问某个URL,本质是连接服务器,将其上的文件打开并下载到本地
    a、   浏览器客户端套接字 –– UDP –– DNS服务端套接字,将域名解析成IP返回
    b、   浏览器客户端套接字 –– TCP –– Web服务端套接字,将文件下载到本地
    常用服务器软件:nginx,httpd
     
    DNS查询为迭代查询
    一般会现在本地DNS查找,如果找不到会在同级DNS查找,若还找不到需要从根DNS服务器逐级问下来(迭代查询);后续解释本地DNS代劳。
    www.cnblogs.com.
    .      #跟域名       #13个跟服务器(美9日1欧3),受限于UDP稳定性
    com   #顶级域名
    cnblogs  #二级域名    #二级域名需去顶级域名中买
    www    #二级域名的主机名

    三、进程
    #串行: 一个一个的运行
    1、什么是程序?什么是进程?
        程序说白了就是一堆文件
        进程就是一个正在执行的过程/程序,所以说进程是一个抽象的概念。这个概念起源操作系统
     
    2、什么是操作系统
        定义:操作系统是位于计算机硬件与应用软件之间,用于协调、管理、控制计算机硬件与软件的资源的一种控制程序
     
    3、操作系统的两大作用:
        1、把复杂丑陋的硬件操作都封装成美丽的接口,提供给应用程序使用
        2、把进程对硬件的竞争变的有序
     
    4、多道技术(单个CPU在多个程序中切换以实现并发)
        多道的产生背景是想要在单个cpu的情况下实现多个进程并发执行的效果
        a、空间上的复用 (多道程序复用内存的空间)
        b、时间上的复用  (多道程序复用CPU时间)
        
        cpu遇到IO操作要切换(提升效率)
        一个进程占用cpu时间过长也切(降低效率)
    进程与进程之间的内存空间是互相隔离的
  • 相关阅读:
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    软件工程实践总结
  • 原文地址:https://www.cnblogs.com/zhangyaqian/p/py20180423.html
Copyright © 2011-2022 走看看