亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python網絡編程socket實現服務端、客戶端操作詳解

 更新時間:2020年03月24日 09:02:22   作者:隨風行云  
這篇文章主要介紹了python網絡編程socket實現服務端、客戶端操作,結合實例形式分析了python基于socket實現服務端、客戶端相關操作技巧與使用注意事項,需要的朋友可以參考下

本文實例講述了python網絡編程socket實現服務端、客戶端操作。分享給大家供大家參考,具體如下:

本文內容:

  • socket介紹
  • TCP:
    • 服務端
    • 客戶端
  • UDP:
    • 服務端
    • 客戶端

首發(fā)時間:2018-02-08 01:14

修改:

  1. 2018-03-20 :重置了布局,增加了UDP

什么是socket:

  • socket又稱"套接字",應用程序通常通過"套接字"向網絡發(fā)出請求或者應答網絡請求。
  • 網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。
  • socket就像電話線插口,只有電話線插上了,才能通信。
  • python中使用socket來進行網絡連接傳輸


    TCP:

    • 如果使用socket模塊來創(chuàng)建TCP客戶端和服務端:
      • 首發(fā)需要導入模塊:import socket
      • 然后創(chuàng)建過程在下面

    服務端:

    TCP服務端一般需要下面幾個操作:建立,綁定IP地址和端口,監(jiān)聽端口,等待連接,接收數據,傳輸數據 ,關閉連接

    • 建立:server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)  【參數默認就是socket.AF_INET, socket.SOCK_STREAM】
    • 綁定端口:server.bind(('IP地址',端口)),【地址和端口號是一個 tuple 】
    • 監(jiān)聽:server.listen()
    • 接受連接: conn,addr=server.accept(),返回值是一個連接實例和一個地址,地址是連接過來的客戶端地址,而數據操作要利用這個連接實例
    • 傳輸數據:conn.send(data),【傳輸的數據必須是字節(jié)流,所以對字符串數據需要使用encode() 】
    • 接收數據read:conn.recv(size),【傳輸的數據必須是字節(jié)流,size是接收的字節(jié)數,如果需要轉成Unicode,需要使用decode() 】
    • 關閉連接close:close()
    import socket
    server=socket.socket()#建立socket
    server.bind(('localhost',1234))#綁定
    server.listen()#監(jiān)聽
    print("開始等待。。。")
    conn,addr=server.accept()#接收連接
    print("連接成功")
    data=conn.recv(1024)#接收數據
    print(data.decode())
    conn.send(data)#發(fā)送數據
    server.close()#關閉連接
    print("--------------------")
    • 上述代碼存在一個問題:只能接受一次連接,連接結束后,服務端socket將關閉,更改成不立即關閉能等待下一個連接的:
    #服務器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #綁定ip和端口
    server.listen(5) #監(jiān)聽
    while True:
      print("開始等待")
      conn, addr = server.accept()
      print(conn, addr)
      print("客戶端連接")
      while True:
        data = conn.recv(1024)
        print("recv:",data)
        if not data: #當data=0時為真
          print("連接斷開...")
          break
        conn.send(data)
    server.close()

    注:上述代碼中在linux中正常運行,在windows中會報錯!

    如果要在windows中運行,需要捕獲異常:

    #服務器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #綁定ip和端口
    server.listen(5) #監(jiān)聽
    while True:
      print("開始等待")
      conn, addr = server.accept()
      print(conn, addr)
      print("客戶端連接")
      while True:
        try:
          data = conn.recv(1024)
          print("recv:",data)
          if not data: #當data=0時為真
            print("連接斷開...")
            break
          conn.send(data)
        except ConnectionResetError as e:
          print(e)
          break
    server.close()

    客戶端:

    TCP客戶端一般需要下面幾個操作:建立socket,連接遠程socket,傳輸數據 ,接收數據,關閉連接

    • 建立:client=socket.socket()
    • 連接:client.connect(('IP地址',端口)),其中地址和端口號是一個 tuple
    • 傳輸數據:client.send(data),傳輸的數據必須是字節(jié)流,所以對字符串數據需要使用encode()
    • 接收數據recv:client.recv(size),傳輸的數據是字節(jié)流,如果需要轉成Unicode,需要使用decode()
    • 關閉連接close:close()
    import socket
    client=socket.socket()#建立socket
    client.connect(('localhost',1234))#連接
    client.send("你好".encode())#發(fā)送數據
    data=client.recv(1024)#接收數據
    print(data.decode())
    client.close()#關閉連接
    • 上述代碼存在一個問題:只能發(fā)送一次數據,發(fā)生完數據就會斷開連接,改成可以多次發(fā)送數據,不自動斷開的【前提是服務端能接收多次】:
    import socket
    client=socket.socket()
    client.connect(('localhost',1234))
    while True:
      cmd=input(">>")
      if len(cmd)==0:
        continue
      client.send(cmd.encode())
      cmd_res=client.recv(1024)
      print(cmd_res.decode())
    client.close()


    UDP:

    服務端:

    UDP服務端通常有以下幾個操作:創(chuàng)建socket,綁定端口,傳輸數據,接收數據

    • 創(chuàng)建socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    • 綁定端口:server.bind(addr),【addr是一個元組,內容為(地址,端口)】
    • 接收數據:data,client_addr=server.recvfrom(1024)
    • 傳輸數據:server.sendto(data,client_addr)
    import socket
    import time
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server.bind(("localhost",1234))
    start_time=time.time()
    while True:
      data,addr=server.recvfrom(1024)
      print(data,addr)
      server.sendto("hello".encode(),addr)
      time.sleep(1)
      if time.time()-start_time>30:
        break
    server.close()

    客戶端:

    UDP客戶端通常有以下幾個操作:創(chuàng)建socket,傳輸數據,接收數據

    • 創(chuàng)建socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    • 傳輸數據:server.sendto(data,addr),【addr是一個元組,內容為(地址,端口)】
    • 接收數據:data,server_addr=client.recvfrom(1024)
    import socket,time
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    addr=("localhost",1234)
    start_time=time.time()
    while True:
      client.sendto(time.ctime().encode(),addr)
      data,addr= client.recvfrom(1024)
      print(data)
      time.sleep(1)
      if time.time()-start_time>30:
        break
    client.close()

更多關于Python相關內容可查看本站專題:《Python Socket編程技巧總結》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設計有所幫助。

相關文章

  • Python BeautifulSoup基本用法詳解(通過標簽及class定位元素)

    Python BeautifulSoup基本用法詳解(通過標簽及class定位元素)

    這篇文章主要介紹了Python BeautifulSoup基本用法(通過標簽及class定位元素),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 詳解如何使用pip卸載所有已安裝的Python包

    詳解如何使用pip卸載所有已安裝的Python包

    在開發(fā)過程中,我們可能會安裝許多 Python 包,有時需要徹底清理環(huán)境,以便從頭開始或者解決沖突問題,下面將介紹如何使用 pip 命令卸載所有已安裝的 Python 包,需要的朋友可以參考下
    2024-06-06
  • 如何用Python數據可視化來分析用戶留存率

    如何用Python數據可視化來分析用戶留存率

    今天和大家來分享一些數據可視化方向的干貨,我們來嘗試用Python來繪制一下“漏斗圖”,感興趣的小伙伴和小編一起進入課題吧,但愿大家會有所收獲
    2021-09-09
  • matplotlib圖例legend語法及設置的方法

    matplotlib圖例legend語法及設置的方法

    這篇文章主要介紹了matplotlib圖例legend語法及設置的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 對python 通過ssh訪問數據庫的實例詳解

    對python 通過ssh訪問數據庫的實例詳解

    今天小編就為大家分享一篇對python 通過ssh訪問數據庫的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python中np.linalg.norm()用法實例總結

    Python中np.linalg.norm()用法實例總結

    在線性代數中一個向量通過矩陣轉換成另一個向量時,原有向量的大小就是向量的范數,這個變化過程的大小就是矩陣的范數,下面這篇文章主要給大家介紹了關于Python中np.linalg.norm()用法的相關資料,需要的朋友可以參考下
    2022-07-07
  • Pytorch卷積層手動初始化權值的實例

    Pytorch卷積層手動初始化權值的實例

    今天小編就為大家分享一篇Pytorch卷積層手動初始化權值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 人臉檢測——基于Flask和PaddleHub

    人臉檢測——基于Flask和PaddleHub

    這篇文章詳細介紹了基于Flask和PaddleHub來進行人臉檢測,想詳細了解的朋友可以參考閱讀
    2023-03-03
  • 解讀sqlalchemy的常用數據類型有哪些

    解讀sqlalchemy的常用數據類型有哪些

    這篇文章主要介紹了解讀sqlalchemy的常用數據類型有哪些,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • python模擬登陸,用session維持回話的實例

    python模擬登陸,用session維持回話的實例

    今天小編就為大家分享一篇python模擬登陸,用session維持回話的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論