Python------网络编程3

Posted hql1117

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python------网络编程3相关的知识,希望对你有一定的参考价值。

  • socket 套接字(模块):负责从传输层接收数据,并进行处理,并由底层交给操作系统。

    • 作用
      • 避免计算机学习各层的接口与协议的使用, socket 已经封装好了所有的接口,使用方便,提升开发效率。
      • socket 本质是一个模块。通过使用学习模块提供的功能,建立客户端与服务端的通信,使用方便.
  • Socket 实现单个客户与服务端单通信:

    • 服务端:

      import socket
      
      # 1. 创建socket对象(买手机)
      phone = socket.socket() # 可以默认不写
      
      # 2. 绑定ip地址和端口(办卡)
      phone.bind(('127.0.0.1', 8848))  # 本地回环地址
      
      # 3. 监听.(开机状态)
      phone.listen(5)
      
      # 4. 接收连接
      print('start')
      conn, addr = phone.accept()  # 程序暂进入待机状态,等待用户端发送信息
      print(conn,addr)
      
      from_client_data = conn.recv(1024)  # 至多接收1024个字节
      print(f'来自客户端addr消息from_client_data.decode("utf-8")')
      to_client = input('>>>')
      conn.send(to_client.encode('utf-8'))
      
      conn.close()
      phone.close()
    • 客户端:

      import socket
      
      # 创建socket对象(买手机)
      phone = socket.socket() # 可以默认不写
      
      # 连接服务器ip地址与端口
      phone.connect(('127.0.0.1', 8848))
      
      # 发消息
      to_server = input('>>>').strip()
      phone.send(to_server.encode('utf-8'))
      # 接收消息
      from_server_data = phone.recv(1024)  # 程序暂时进入待机状态,等待服务端的数据传过来
      
      print(f'来自服务端消息:from_server_data.decode("utf-8")')
      
      # 关机
      phone.close()
  • socket 实现通信循环:

    • 服务端:

      import socket
      
      phone = socket.socket()
      
      phone.bind(('127.0.0.1', 8888))
      
      phone.listen(5)
      
      # 接收连接
      
      while 1:
          print('start')
          conn, addr = phone.accept()  # 程序进入待机状态
          print(conn,addr)
          while 1:
              try:
                  from_client_data = conn.recv(1024)  # 至多接收1024个字节
                  if from_client_data == b'q':
                      break
                  print(f'来自客户端addr消息from_client_data.decode("utf-8")')
                  to_client = input('>>>')
                  conn.send(to_client.encode('utf-8'))
              except ConnectionResetError:
                  break
          conn.close()
      phone.close()
    • 客户端:

      import socket
      
      # 创建socket对象(买手机)
      phone = socket.socket() 
      
      # 连接服务器ip地址与端口
      phone.connect(('127.0.0.1', 8888))
      
      # 发消息
      while 1:
          to_server = input('>>>').strip()
          if to_server.upper() == 'Q':
              phone.send('q'.encode('utf-8'))
              break
          phone.send(to_server.encode('utf-8'))
          # 接收消息
          from_server_data = phone.recv(1024)  # 待机,等待接收服务端的数据
          print(f'来自服务端消息:from_server_data.decode("utf-8")')
      
      # 关机
      phone.close()
  • socket 实现通信,连接循环:

    • 服务端:

      import socket
      
      phone = socket.socket() 
      
      # 2. 绑定ip地址和端口(办卡)
      phone.bind(('127.0.0.1', 8888))  
      
      # 3. 监听.(开机状态)
      phone.listen(5)
      
      # 4. 接收连接
      print('start')
      conn, addr = phone.accept()  # 程序夯住
      while 1:
          try:
              from_client_data = conn.recv(1024)  # 至多接收1024个字节
              if from_client_data == b'q':
                  break
              print(f'来自客户端addr消息from_client_data.decode("utf-8")')
              to_client = input('>>>')
              conn.send(to_client.encode('utf-8'))
          except ConnectionResetError:
              break
      conn.close()
      phone.close()
    • 客户端:

      import socket
      
      # 1. 创建socket对象(买手机)
      phone = socket.socket() # 可以默认不写
      
      # 连接服务器ip地址与端口
      phone.connect(('127.0.0.1', 8888))
      
      # 发消息
      while 1:
          to_server = input('>>>').strip()
          if to_server.upper() == 'Q':
              phone.send('q'.encode('utf-8'))
              break
          phone.send(to_server.encode('utf-8'))
          # 接收消息
          from_server_data = phone.recv(1024)  # 夯住,等待服务端的数据传过来
          print(f'来自服务端消息:from_server_data.decode("utf-8")')
      
      # 关机
      phone.close()
  • socket 完成获取远程命令的:

    • 服务端:

      import socket
      import subprocess
      
      phone = socket.socket()
      
      phone.bind(('127.0.0.1', 8888))
      
      phone.listen(5)
      
      # 4. 接收连接
      print('start')
      conn, addr = phone.accept()
      while 1:
          try:
              cmd = conn.recv(1024) #  dir
              obj = subprocess.Popen(cmd.decode('utf-8'),
                                     shell=True,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE,
                                     )
      
              result = obj.stdout.read() + obj.stderr.read()
              conn.send(result)
          except ConnectionResetError:
              break
      conn.close()
      phone.close()
    • 用户端:

      import socket
      
      phone = socket.socket()
      
      phone.connect(('127.0.0.1', 8888))
      
      # 发消息
      while 1:
          cmd = input('>>>').strip()
          phone.send(cmd.encode('utf-8'))
          # 接收消息
          result = phone.recv(1024)  # 夯住,等待服务端的数据传过来
          print(result.decode('gbk'))
      
      # 关机
      phone.close()

以上是关于Python------网络编程3的主要内容,如果未能解决你的问题,请参考以下文章

Python 1-3Python的第一个程序 Hello World

#跟着教程学# 3Python基础 //Maya select和ls命令返回值问题

3Python标准库系列之os模块

虫师Selenium2+Python_3Python基础

3Python 数据解析

3Python运算符