1. 程式人生 > >11.網絡編程:socket、服務端、客戶端

11.網絡編程:socket、服務端、客戶端

adding 編程 技術分享 。。 blog tom bre sta 分享

socket:

  • socket又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。
  • python中使用socket來進行網絡連接傳輸
  • 技術分享圖片

    由圖可知:

    socket中客戶端需要進行的操作是:建立,連接,傳輸數據 ,接收數據,關閉連接

    服務端需要進行的操作是:建立,綁定IP地址和端口,等待連接,接收數據,傳輸數據 ,關閉連接


    服務端:

    • 建立:socket.socket()
    • 綁定端口:bind((‘IP地址‘,端口)),其中地址和端口號是一個 tuple
    • 監聽:listen()
    • 接受連接:accept(),返回值是一個連接實例和一個地址,地址是連接過來的客戶端地址,而數據操作要利用這個連接實例
    • 傳輸數據:send(),傳輸的數據必須是字節流,所以對字符串數據需要使用encode()
    • 接收數據read:recv(x),傳輸的數據必須是字節流,x是接收的字節數,如果需要轉成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) #監聽
    
    print("開始等待")
    while True:
        conn, addr 
    = server.accept() print(conn, addr) print("客戶端連接") while True: data = conn.recv(1024) print("recv:",data) if not data: print("連接斷開...") break conn.send(data) server.close()


    客戶端:

    • 建立:socket.socket()
    • 連接:connect((‘IP地址‘,端口)),其中地址和端口號是一個 tuple
    • 傳輸數據:send(),傳輸的數據必須是字節流,所以對字符串數據需要使用encode()
    • 接收數據recv:recv(),傳輸的數據是字節流,如果需要轉成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()

    11.網絡編程:socket、服務端、客戶端