<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] >[success] # 簡單入門 >[danger] ##### 網址的組成 ~~~ 1.協議 http,https 其中 https 是http加密協議 2.主機 baidu.com kancloud.cn 之類的網址 3.端口 HTTP 協議默認80, 因此一般不用填寫 4.路徑 主機后面用 [/] 分割的就是路徑 ~~~ >[danger] ##### ip和域名 ~~~ 1.電腦通信是靠IP地址,ip由于繁瑣不容易記住,誕生了域名 2.電腦想DNS 服務器查新域名對應IP 3.win 查詢對應ip 指令ping 主機名 ~~~ ![](https://box.kancloud.cn/f07cc7317289a03016594a08b30f4dcd_554x211.png) >[danger] ##### 什么是端口 ~~~ 1.廣為流傳的比喻,ip相當于你寫信的地址,端口相當于收信人 2.端口是一個16位數字,范圍在0-65535 也就是2**16 ~~~ >[danger] ##### HTTP協議 ~~~ 1.一種傳輸協議,雙方都要遵守規范 2.由于收發的是文本信息,所以叫超文本傳輸協議 3.瀏覽器(客戶端)按照規定的格式發送文本數據請求到服務器 4.服務器去響應請求,按照規定格式返回文本數據到瀏覽器 5.瀏覽器去解析處理得到的數據 ~~~ >[danger] ##### HTTP請求和響應 ~~~ 1.請求行或者響應行 2.Header 3.\r\n\r\n ,連續兩個回車符,用來分割Header 和Body 4.Body ~~~ <hr/> * 解釋說明 請求 -- request ![](https://box.kancloud.cn/8bebf91980d56bc707ec4f41482e9cd7_339x54.png) ~~~ 原始數據: 1.GET / HTTP/1.1\r\nhost:www.baidu.com\r\n\r\n 打印數據: 1.請求行: GET / HTTP/1.1 2.請求頭: Host: www.baidu.com 解釋: 1.GET 是請求方式 2./是請求路徑 3.HTTP/1.1 中,1.1是版本號 ~~~ <hr/> * 解釋說明 響應 -- respnse ![](https://box.kancloud.cn/6e46441acf678f57d078a411ed8beedc_274x72.png) ~~~ 1.響應行:HTTP/1.1 200 OK 2.響應頭:Content-Length: 218 Content-Type: text/html; charset=UTF-8 ~~~ >[success] # 利用socket 客戶端和服務器 >[danger] ##### 客戶端 client.py ~~~ 1.創建一個socket對象 2.創建主機和域名 3.連接主機 4.發送 HTTP 請求給服務器,發送要以bytes 字節類型 5.服務器會響應數據,響應的數據也是bytes 字節類型 6.如果頁面 有一些src 便簽屬性的時候,客戶端會接著在去請求服務器,獲取 ~~~ ~~~ import socket # 創建一個 socket 對象 # 參數 socket.AF_INET 表示是 ipv4 協議 # 參數 socket.SOCK_STREAM 表示是 tcp 協議 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 這兩個其實是默認值, 所以你可以不寫, 如下 # s = socket.socket() # 如果是https 協議 # s = ssl.wrap_socket(socket.socket()) # 主機(域名或者ip)和端口 host = 'g.cn' port = 80 # 用 connect 函數連接上主機, 參數是一個 tuple s.connect((host, port)) # 連接上后, 可以通過這個函數得到本機的 ip 和端口 ip, port = s.getsockname() print('本機 ip 和 port {} {}'.format(ip, port)) # 構造一個 HTTP 請求 http_request = 'GET / HTTP/1.1\r\nhost:{}\r\n\r\n'.format(host) # 發送 HTTP 請求給服務器 # send 函數只接受 bytes 作為參數 # str.encode 把 str 轉換為 bytes, 編碼是 utf-8 request = http_request.encode('utf-8') print('請求', request) s.send(request) # 接受服務器的響應數據 # 參數是長度, 這里為 1023 字節 # 所以這里如果服務器返回的數據中超過 1023 的部分你就得不到了 response = s.recv(1023) # 輸出響應的數據, bytes 類型 print('響應', response) # 轉成 str 再輸出 print('響應的 str 格式', response.decode('utf-8')) ~~~ ![](https://box.kancloud.cn/becee0b1abac94ba1066566fe72bda28_718x343.png) >[danger] 服務端-- server.py ~~~ 1.創建一個服務器host,和端口,不填默認本地host 2.把host 和端口綁定 3.循環監聽,當有請求的時候執行s.accept(),沒有的時候就卡住 4.構造一個字節按照響應的格式 返回個客戶端 ~~~ ~~~ import socket # 運行這個程序后, 瀏覽器打開 localhost:2000 就能訪問了 # 服務器的 host 為空字符串, 表示接受任意 ip 地址的連接 # post 是端口, 這里設置為 2000, 隨便選的一個數字 host = '' port = 2000 # s 是一個 socket 實例 s = socket.socket() # s.bind 用于綁定 # 注意 bind 函數的參數是一個 tuple,綁定服務器和端口 s.bind((host, port)) # 用一個無限循環來處理請求 while True: # 套路, 先要 s.listen 開始監聽 s.listen(5) # 當有客戶端過來連接的時候, s.accept 函數就會返回 2 個值 # 分別是 連接 和 客戶端 ip 地址 connection, address = s.accept() # recv 可以接收客戶端發送過來的數據 # 參數是要接收的字節數 # 返回值是一個 bytes 類型 # 取出所有數據 buffer_size = 1000 r = b'' while True: request = connection.recv(buffer_size) r +=request if len(request)<buffer_size: break # bytes 類型調用 decode('utf-8') 來轉成一個字符串(str) print('ip and request, {}\n{}'.format(address, request.decode('utf-8'))) # b'' 表示這是一個 bytes 對象,構造的響應信息格式 response = b'HTTP/1.1 200 OK\r\n\r\n<h1>Hello World!</h1>' # 用 sendall 發送給客戶端 connection.sendall(response) # 發送完畢后, 關閉本次連接 connection.close() ~~~ >[success] # 解碼和編碼 ![](https://box.kancloud.cn/37c55dba92f9b7a1ae5f7d5572b23879_324x262.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看