zoukankan      html  css  js  c++  java
  • socket通信

    1. socket套接字.

      五层协议: 从传输层包括传输层一下,都是操作系统帮助我们封装的各种head.你不用去关心.

      # content = input('>>>')
      # print(content)
      # 怎么交给操作系统( ⊙o⊙ )?
      # 模块,或者内置函数 必须有方法内置的一些代码接收数据,然后在底层交由操作系统.
      
      # socket套接字充当的就是内置模块的角色.
      
      # 你说一下socket的套接字?
      '''
      socket 套接字,它存在于传输层与应用层之间的抽象层,
          1. 避免你学习各层的接口,以及协议的使用, socket已经封装好了所有的接口.
              直接使用这些接口或者方法即可,使用起来方便,提升开发效率.
          2. socket就是一个模块.通过使用学习模块提供的功能,
              建立客户端与服务端的通信,使用方便.
      '''
      
    2. 基于TCP协议的socket通信.

    3. 单个客户与服务端通信.

      服务端:

      # content = input('>>>')
      # print(content)
      # 怎么交给操作系统( ⊙o⊙ )?
      # 模块,或者内置函数 必须有方法内置的一些代码接收数据,然后在底层交由操作系统.
      
      # socket套接字充当的就是内置模块的角色.
      
      # 你说一下socket的套接字?
      '''
      socket 套接字,它存在于传输层与应用层之间的抽象层,
          1. 避免你学习各层的接口,以及协议的使用, socket已经封装好了所有的接口.
              直接使用这些接口或者方法即可,使用起来方便,提升开发效率.
          2. socket就是一个模块.通过使用学习模块提供的功能,
              建立客户端与服务端的通信,使用方便.
      '''
      

      客户端:

      import socket
      
      # 1. 创建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()
      
      
      
    4. 通信循环.

      服务端:

      import socket
      
      phone = socket.socket()
      
      phone.bind(('127.0.0.1', 8888))
      
      phone.listen(5)
      
      # 4. 接收连接
      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
      
      # 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()
      
    5. 通信,连接循环.

      服务端:

      # import socket
      #
      # # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      # # 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)
      # while 1:
      #     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
      
      # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      # 1. 创建socket对象(买手机)
      phone = socket.socket() # 可以默认不写
      
      # 2. 绑定ip地址和端口(办卡)
      phone.bind(('127.0.0.1', 8888))  # 本地回环地址
      
      # 3. 监听.(开机状态)
      phone.listen(5)
      
      # 4. 接收连接
      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
      
      # 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()
      
    6. 利用socket完成获取远端命令的示例.

      while 1:
          try:
              from_client_data = conn.recv(1024)  #至多接受1024字节
              obj = subprocess.Popen(from_client_data.decode("utf_8"),
                                     shell=True,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE,
                                     )
              result = obj.stdout.read()+ obj.stderr.read()
              conn.send(result)
          except ConnectionResetError:
              break
      
    7. 黏包现象.

    8. 今日总结

      名词,协议整理.

  • 相关阅读:
    DevExpress中的gridControl选择问题
    使用IL DASM来查看接口内的自动属性
    多态的使用 虚方法、抽象类、接口
    匿名类的使用及原理
    JAVA小问题解决办法
    数据库02
    数据库01(验证连接是否成功)
    Java 类库知识总结
    Java多线程知识总结(补充)
    java Thread和Runable的深刻理解
  • 原文地址:https://www.cnblogs.com/W-Y-C/p/11196067.html
Copyright © 2011-2022 走看看