zoukankan      html  css  js  c++  java
  • Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    1. socket / 套接字

    1.socket是处于应用层与传输层之间的抽象层,它是一组操作起来非常简单的接口(接收数据)此接口接收数据后,交由操作系统
    2.为什么存在socket抽象层
      如果直接与操作系统交互非常麻烦,繁琐,socket对这些繁琐的操作高度的封装,简化
    3.socket在Python中就是一个模块
    

    2. 基于TCP协议的socket简单通信

    • 客户端(client)

      import socket
      # 表示基于TCP进行连接
      client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      # 连接的IP地址以及端口
      client.connect(("127.0.0.1",8888))  # 必须是元组
      
      # 给服务端发送内容,必须用二进制进行发送消息
      date = input("请输入:")
      client.send(date.encode("utf-8"))
      
      # 接收服务端发送的内容,允许接收服务端至多1024字节
      from_server_date = client.recv(1024)
      
      # 打印服务端发过来的消息
      print(f"来自服务端的消息:{from_server_date}")
      
      client.close()
      
    • 服务端(server)

      import socket
      
      # 默认基于TCP协议的socket
      server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
       # 绑定IP地址和端口
      server.bind(("127.0.0.1",8888)) 
      # 开机监听
      server.listen(5) # 服务端可以接收N个链接,但是只能同一时刻回应五个请求.
      
      # 等待连接
      conn,addr = server.accept() # 阻塞(等待客户端的连接)
      
      print(conn,addr) # 打印数据传输的通道、客户端的ip 端口,conn代表两条管道
      
      from_client_data = conn.recv(1024) # 至多接收1024个字节 阻塞,超过1024分批接收
      
      print(f'来自客户端的消息:{from_client_data}') # 打印客户端发送的内容
      
      conn.send(from_client_data.upper()) # 给客户端发送内容
      
      conn.close() # 关闭通道
      
      server.close() # 关机
      

    3. 基于UDP协议的socket通信

    • 服务端

      import socket
      # 基于UDP协议的连接
      server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
      # 绑定IP和端口
      server.bind(('192.168.14.198',9000))
      
      while 1:
          # 等待接收消息
          from_client_data = server.recvfrom(1024)   # 阻塞,等待客户来消息
          # 打印客户端的IP以及消息
          print(f'33[1;35;0m来自客户端{from_client_data[1]}: {from_client_data[0].decode("utf-8")} 33[0m')   
          # 给客户端回消息
          to_client_data = input('>>>').strip()
          server.sendto(to_client_data.encode('utf-8'),from_client_data[1])
      
      
      # 1. 基于UDP协议的socket无须建立管道,先开启服务端或者客户端都行.
      # 2. 基于UDP协议的socket接收一个消息,与发送一个消息都是无连接的.
      # 3. 只要拿到我的IP地址和端口就都可以给我发消息,我按照顺序接收消息.
      
    • 客户端

      import socket
      # 基于UDP协议的连接
      client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
      
      while 1:
          # 无需建立管道,通过服务的IP和端口进行发送消息
          to_server_data = input('>>>:').strip()
          client.sendto(to_server_data.encode('utf-8'),('127.0.0.1',9000))
          # 接收服务端返回的消息
          data,addr = client.recvfrom(1024)
          # 打印服务端的IP以及返回的消息
          print(f'来自服务端{addr}消息:{data.decode("utf-8")}')
      

    4. 字符串转bytes类型

    • 在ASCII表中的字符

      s1 = 'hello'
      s2 = b'hello'
      print(s1.encode('utf-8'))   # b'hello'
      
      # 对于在ASCII表中的字符可以通过在字符前面加b'',转换成bytes类型
      
    • 非ASCII表中的字符

      s = '你好'
      print(s.encode('utf-8'))
      
      # 对于非ASCII表中的字符,只能通过encode ,转化成bytes类型
      
  • 相关阅读:
    POJ 1659 Frogs' Neighborhood
    zoj 2913 Bus Pass(BFS)
    ZOJ 1008 Gnome Tetravex(DFS)
    POJ 1562 Oil Deposits (DFS)
    zoj 2165 Red and Black (DFs)poj 1979
    hdu 3954 Level up
    sgu 249 Matrix
    hdu 4417 Super Mario
    SPOJ (BNUOJ) LCM Sum
    hdu 2665 Kth number 划分树
  • 原文地址:https://www.cnblogs.com/liubing8/p/11366626.html
Copyright © 2011-2022 走看看