溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python網(wǎng)絡(luò)編程socket如何實(shí)現(xiàn)服務(wù)端、客戶端

發(fā)布時(shí)間:2021-05-17 11:28:33 來(lái)源:億速云 閱讀:247 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹python網(wǎng)絡(luò)編程socket如何實(shí)現(xiàn)服務(wù)端、客戶端,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

本文內(nèi)容:

  • socket介紹

  • TCP:

    • 服務(wù)端

    • 客戶端

  • UDP:

    • 服務(wù)端

    • 客戶端

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

修改:

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


什么是socket:

  • socket又稱"套接字",應(yīng)用程序通常通過(guò)"套接字"向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。

  • 網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。

  • socket就像電話線插口,只有電話線插上了,才能通信。

  • python中使用socket來(lái)進(jìn)行網(wǎng)絡(luò)連接傳輸




    TCP:

    服務(wù)端:

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

    import socket
    server=socket.socket()#建立socket
    server.bind(('localhost',1234))#綁定
    server.listen()#監(jiān)聽(tīng)
    print("開(kāi)始等待。。。")
    conn,addr=server.accept()#接收連接
    print("連接成功")
    data=conn.recv(1024)#接收數(shù)據(jù)
    print(data.decode())
    conn.send(data)#發(fā)送數(shù)據(jù)
    server.close()#關(guān)閉連接
    print("--------------------")

     

    #服務(wù)器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #綁定ip和端口
    server.listen(5) #監(jiān)聽(tīng)
    while True:
      print("開(kāi)始等待")
      conn, addr = server.accept()
      print(conn, addr)
      print("客戶端連接")
      while True:
        data = conn.recv(1024)
        print("recv:",data)
        if not data: #當(dāng)data=0時(shí)為真
          print("連接斷開(kāi)...")
          break
        conn.send(data)
    server.close()

     

    注:上述代碼中在linux中正常運(yùn)行,在windows中會(huì)報(bào)錯(cuò)!

    如果要在windows中運(yùn)行,需要捕獲異常:

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

     

    客戶端:

    TCP客戶端一般需要下面幾個(gè)操作:建立socket,連接遠(yuǎn)程socket,傳輸數(shù)據(jù) ,接收數(shù)據(jù),關(guān)閉連接

    import socket
    client=socket.socket()#建立socket
    client.connect(('localhost',1234))#連接
    client.send("你好".encode())#發(fā)送數(shù)據(jù)
    data=client.recv(1024)#接收數(shù)據(jù)
    print(data.decode())
    client.close()#關(guān)閉連接

     

    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:

    服務(wù)端:

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

    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客戶端通常有以下幾個(gè)操作:創(chuàng)建socket,傳輸數(shù)據(jù),接收數(shù)據(jù)

    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()

     

    • 創(chuàng)建socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    • 傳輸數(shù)據(jù):server.sendto(data,addr),【addr是一個(gè)元組,內(nèi)容為(地址,端口)】

    • 接收數(shù)據(jù):data,server_addr=client.recvfrom(1024)

    • 創(chuàng)建socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    • 綁定端口:server.bind(addr),【addr是一個(gè)元組,內(nèi)容為(地址,端口)】

    • 接收數(shù)據(jù):data,client_addr=server.recvfrom(1024)

    • 傳輸數(shù)據(jù):server.sendto(data,client_addr)

    • 上述代碼存在一個(gè)問(wèn)題:只能發(fā)送一次數(shù)據(jù),發(fā)生完數(shù)據(jù)就會(huì)斷開(kāi)連接,改成可以多次發(fā)送數(shù)據(jù),不自動(dòng)斷開(kāi)的【前提是服務(wù)端能接收多次】:

    • 建立:client=socket.socket()

    • 連接:client.connect(('IP地址',端口)),其中地址和端口號(hào)是一個(gè) tuple

    • 傳輸數(shù)據(jù):client.send(data),傳輸?shù)臄?shù)據(jù)必須是字節(jié)流,所以對(duì)字符串?dāng)?shù)據(jù)需要使用encode()

    • 接收數(shù)據(jù)recv:client.recv(size),傳輸?shù)臄?shù)據(jù)是字節(jié)流,如果需要轉(zhuǎn)成Unicode,需要使用decode()

    • 關(guān)閉連接close:close()

    • 上述代碼存在一個(gè)問(wèn)題:只能接受一次連接,連接結(jié)束后,服務(wù)端socket將關(guān)閉,更改成不立即關(guān)閉能等待下一個(gè)連接的:

    • 建立:server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)  【參數(shù)默認(rèn)就是socket.AF_INET, socket.SOCK_STREAM】

    • 綁定端口:server.bind(('IP地址',端口)),【地址和端口號(hào)是一個(gè) tuple 】

    • 監(jiān)聽(tīng):server.listen()

    • 接受連接: conn,addr=server.accept(),返回值是一個(gè)連接實(shí)例和一個(gè)地址,地址是連接過(guò)來(lái)的客戶端地址,而數(shù)據(jù)操作要利用這個(gè)連接實(shí)例

    • 傳輸數(shù)據(jù):conn.send(data),【傳輸?shù)臄?shù)據(jù)必須是字節(jié)流,所以對(duì)字符串?dāng)?shù)據(jù)需要使用encode() 】

    • 接收數(shù)據(jù)read:conn.recv(size),【傳輸?shù)臄?shù)據(jù)必須是字節(jié)流,size是接收的字節(jié)數(shù),如果需要轉(zhuǎn)成Unicode,需要使用decode() 】

    • 關(guān)閉連接close:close()

    • 首發(fā)需要導(dǎo)入模塊:import socket

    • 然后創(chuàng)建過(guò)程在下面

    • 如果使用socket模塊來(lái)創(chuàng)建TCP客戶端和服務(wù)端:

python的五大特點(diǎn)是什么

python的五大特點(diǎn):1.簡(jiǎn)單易學(xué),開(kāi)發(fā)程序時(shí),專注的是解決問(wèn)題,而不是搞明白語(yǔ)言本身。2.面向?qū)ο螅c其他主要的語(yǔ)言如C++和Java相比, Python以一種非常強(qiáng)大又簡(jiǎn)單的方式實(shí)現(xiàn)面向?qū)ο缶幊獭?.可移植性,Python程序無(wú)需修改就可以在各種平臺(tái)上運(yùn)行。4.解釋性,Python語(yǔ)言寫的程序不需要編譯成二進(jìn)制代碼,可以直接從源代碼運(yùn)行程序。5.開(kāi)源,Python是 FLOSS(自由/開(kāi)放源碼軟件)之一。

以上是“python網(wǎng)絡(luò)編程socket如何實(shí)現(xiàn)服務(wù)端、客戶端”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI