zoukankan      html  css  js  c++  java
  • Python进阶-网络编程基础

    一、C/S架构

    1.硬件C/S架构
      如PC-打印机
    2.软件C/S架构
      如PC-网站服务器
    参照:
      https://baike.baidu.com/item/Client%2FServer/1504488?fr=aladdin&fromid=826311&fromtitle=C%2FS

    二、OSI七层模型

     

      OSI七层中,对应着网络通信中的各个通信协议,了解OSI七层的运作过程是socket编程的重重之重,为什么这么说?看下图:
           
      从图中看出,socket工作于软件C/S架构以及OSI七层模型中的应用层和传输层之间
    附:         
    TCP协议详解:

    三、socke是什么狗屁?

      socket原指孔或插座,最初是作为BSD UINX的进程通信机制,同被称为套接字。当今套接字是Windows和Mac等操作系统所共同遵守的网络编程标准,是OSI七层模型中应用层和传输层之间抽象层,用于描述IP地址和端口,是一个通信链的句柄,可用来实现不同虚拟机或不同计算机之间的通信或者主机内的不同进程间的通信。Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务。
      在操作系统上,  socket屏蔽了TCP/IP网络传输层及以下的网络细节,为操作系统提供网络抽象,开发者编写的网络程序都会直接或间接地用到socket抽象。通过socket抽象可以直接控制传输层的两大协议(TCP、UDP),甚至包括IP、ICMP等网络层协议。
           简单的说,socket就是一条IP地址+端口+协议的三元组唯一标识一条通信链路,服务器端的一个通信链路可以对应多个客户端。

    四、socket的种类

    1.基于文件系统的套接字家族
      套接字家族的名字:AF_UNIX
      之前提到,socket最初是作为UNIX的进程机制,UNIX一切皆文件,它是基于文件的套接字调用的就是底层的文件系统取数据,两个套接字进程运行在同一机器上,可通过访问同一文件系统间接完成通信。
     2.基于网络类型的套接字家族:
      网络类型套接字名字:AF_INET
      基于IPv4的套接字,另外还有用于IPv6的AF_INET6

    五、socket编程

    1.套接字工作流程
     
     
    2.基于TCP的套接字简单实现
    # 服务器端
    import socket
     
    # 实例化一个socket对象,并指定网络层协议、传输层协议
    socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 绑定IP、端口号
    socket_server.bind(('127.0.0.1',8080),)
    # 同一时间内能够接收的请求
    socket_server.listen(5)
    # 等待连接
    connect,client_address = socket_server.accept()
    # 设置接收消息,最大限制为1024
    receive_mag = connect.recv(1024)
    print('收到客户端的消息:%s' % receive_mag.decode('UTF-8'))
    # 发送数据
    connect.send(receive_mag.upper())
    
    # 关闭连接
    connect.close()
     
    
    # 客户端
    import socket
    
    socket_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 连接服务端,指定IP、端口号
    socket_client.connect(('127.0.0.1',8080))
    # 向服务端发消息
    socket_client.send('Hello,I am client!'.encode('utf-8'))
    data = socket_client.recv(1024)
    print('接收到服务器的消息:%s' % data.decode('utf-8'))
    
    socket_client.close()

    3.基于TCP的套接字连接循环和通信循环

    # 服务器端
    import socket
    
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.bind(('127.0.0.1',8080))
    phone.listen(5)
    while True: # 连接循环
      connect,client_address = phone.accept()
      print('客户端:',client_address)
      while True: # 通信循环
        try:
          msg = connect.recv(1024)
          print('客户端消息:',msg)
          connect.send(msg+b'from server')
        except ConnectionResetError:
          break
      connect.close()
    phone.close()
    
    # 客户端
    import socket
    
    phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    phone.connect(('127.0.0.1',8080)) # 拨电话,地址为服务端的ip和端口
    while True:
      msg = input('>>>).strip()
      phone.send(msg.encode('utf-8')) # 发消息
      data = phone.recv(1024) #收消息
      print(data.decode('utf-8'))
    phone.close()

     4.基于UDP的套接字实现

      1)UDP原理

        参考:https://baike.baidu.com/item/UDP/571511

      2)套接字实现

    # 服务器端
    import socket
    
    # SOCK_DGRAM 数据包协议
    server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server.bind(('127.0.0.1',8080),)
    
    while True:
        data,addr = server.recvfrom(1024)
        print(data.decode('utf-8'),addr)
        server.sendto(data.upper(),addr)
    
    # 客户端 import socket # SOCK_DGRAM 数据包协议 client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg = input('>>>').strip() if len(msg) == 0:continue client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) data,addr = client.recvfrom(1024) print(data.decode('utf-8'),addr)
  • 相关阅读:
    Xamarin.Forms Layout Challenges – Social Network App(转载)
    Erlang gen_server:start_link/3 和gen_server:start_link/4
    Erlang 从URL中截取尾部文件名
    Erlang 聊天室程序(三) 数据交换格式json的decode
    SOCKS5协议
    Erlang 聊天室程序( 一)
    Erlang 聊天室程序(八) 主题房间supervisor 的使用
    Erlang 聊天室程序(四) 数据交换格式json的encode
    Erlide 的安装使用
    日志系统引起的争论
  • 原文地址:https://www.cnblogs.com/mdzzbojo/p/8981571.html
Copyright © 2011-2022 走看看