1. 程式人生 > 程式設計 >python網路程式設計socket實現服務端、客戶端操作詳解

python網路程式設計socket實現服務端、客戶端操作詳解

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

本文內容:

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

首發時間:2018-02-08 01:14

修改:

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

什麼是socket:

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


    TCP:

    • 如果使用socket模組來建立TCP客戶端和服務端:
      • 首發需要匯入模組:import socket
      • 然後建立過程在下面

    服務端:

    TCP服務端一般需要下面幾個操作:建立,繫結IP地址和埠,監聽埠,等待連線,接收資料,傳輸資料,關閉連線

    • 建立:server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 【引數預設就是socket.AF_INET,socket.SOCK_STREAM】
    • 繫結埠:server.bind(('IP地址',埠)),【地址和埠號是一個 tuple 】
    • 監聽:server.listen()
    • 接受連線: conn,addr=server.accept(),返回值是一個連線例項和一個地址,地址是連線過來的客戶端地址,而資料操作要利用這個連線例項
    • 傳輸資料:conn.send(data),【傳輸的資料必須是位元組流,所以對字串資料需要使用encode() 】
    • 接收資料read:conn.recv(size),【傳輸的資料必須是位元組流,size是接收的位元組數,如果需要轉成Unicode,需要使用decode() 】
    • 關閉連線close:close()
    import socket
    server=socket.socket()#建立socket
    server.bind(('localhost',1234))#繫結
    server.listen()#監聽
    print("開始等待。。。")
    conn,addr=server.accept()#接收連線
    print("連線成功")
    data=conn.recv(1024)#接收資料
    print(data.decode())
    conn.send(data)#傳送資料
    server.close()#關閉連線
    print("--------------------")
    • 上述程式碼存在一個問題:只能接受一次連線,連線結束後,服務端socket將關閉,更改成不立即關閉能等待下一個連線的:
    #伺服器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #繫結ip和埠
    server.listen(5) #監聽
    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',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),傳輸的資料必須是位元組流,所以對字串資料需要使用encode()
    • 接收資料recv:client.recv(size),傳輸的資料是位元組流,如果需要轉成Unicode,需要使用decode()
    • 關閉連線close:close()
    import socket
    client=socket.socket()#建立socket
    client.connect(('localhost',1234))#連線
    client.send("你好".encode())#傳送資料
    data=client.recv(1024)#接收資料
    print(data.decode())
    client.close()#關閉連線
    • 上述程式碼存在一個問題:只能傳送一次資料,發生完資料就會斷開連線,改成可以多次傳送資料,不自動斷開的【前提是服務端能接收多次】:
    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服務端通常有以下幾個操作:建立socket,繫結埠,傳輸資料,接收資料

    • 建立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客戶端通常有以下幾個操作:建立socket,傳輸資料,接收資料

    • 建立socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    • 傳輸資料:server.sendto(data,addr),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程式設計有所幫助。