Socket编程:HTTP/Socket/TCP

《Python3高级核心技术97讲,bobby》学习笔记,第九章:HTTP/Socket/TCP,socket编程案例。
266阅读 · 4评论 · 2020-6-17 23:14发布

9.1 HTTP、Socket、TCP

  • 五层网络模型:应用层、传输层、网络层、数据链路层、物理层。
  • HTTP、FTP在应用层。
  • TCP、UDP在传输层。
  • IP、ICMP在网络层。
  • socket是用于连接应用层和传输层的技术。

9.2 使用socket实现通信

  • 服务端:socket-bind-listen-accept()-阻塞等待请求-recv()-send()-close()
  • 客户端:socket-connect()-send()-recv()-close()
  • 服务端示例代码:

    import socket
      server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 类型,类型协议
      server.bind(('0.0.0.0', 8001))
      server.listen()
      sock, addr = server.accept()
    
      data = sock.recv(1024)
      print(data.decode("utf8"))
      sock.send("hello {}".format(data.decode("utf8")).encode("utf8"))
      server.close()
      sock.close()
    
  • 客户端示例代码:
    import socket
      client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 类型,类型协议
      client.connect(('127.0.0.1',8001))
      client.send("test".encode("utf8"))
      data = client.recv(1024)
      print(data.decode("utf8"))
      client.close()
    

9.3 socket实现实时聊天

  • 服务端代码:

    import socket
      server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # 类型,类型协议
      server.bind(('0.0.0.0', 8001))
      server.listen()
      sock, addr = server.accept()
    
      while True:
          data = sock.recv(1024)
          print(data.decode("utf8"))
          re_data = input()
          sock.send(re_data.encode("utf8"))
    
  • 客户端代码:

    import socket
    
      client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 类型,类型协议
      client.connect(('127.0.0.1', 8001))
      while True:
          re_data = input()
          client.send(re_data.encode("utf8"))
          data = client.recv(1024)
          print(data.decode("utf8"))
    

9.4 socket实现http请求

  • 实现代码如下:

    import socket
      from urllib.parse import urlparse
    
      def get_url(url):
          url = urlparse(url)
          host = url.netloc
          path = url.path
          if path == "":
              path = "/"
    
          client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          client.connect((host,80))
    
          client.send("GET {} HTTP/1.1\r\nHost:{}\r\nConnection:close\r\n\r\n".format(path, host).encode("utf8"))
          data = b""
          while True:
              d = client.recv(1024)
              if d:
                  data += d
              else:
                  break
    
          data = data.decode("utf8")
          html_data = data.split("\r\n\r\n")[1]  # 去掉响应头信息
          print(html_data)
          client.close()
    
      if __name__ == '__main__':
          get_url("http://www.baidu.com")
    

共有4 条评论


  • 小小白 2020-7-17 10:27 时说:
    看着好深奥

  • Jacky 2020-7-17 10:27 时说:
    博主的评论好漂亮

  • Jacky 2020-7-17 10:28 时说:
    博主可以把评论的时间编程类似“三天前”,“刚刚”这样的

  • Jacky 2020-7-17 10:29 时说:
    搜索功能还是很实用的呀