2016-08-18 76 views
2

的UDP服務器:UDP服務器和UDP客戶端之間的區別:sock.bind((主機,端口))位於客戶端還是服務器端?

# -*- coding: utf-8 -*- 
#!/usr/bin/python3 
#server UDP 

from socket import * 

def main(): 
    # Cria host e port number 
    host = "" 
    port = 5000 

    # Cria socket     #UDP 
    server = socket(AF_INET, SOCK_DGRAM) 

    # Indica que o servidor foi iniciado 
    print("Servidor iniciado") 

    # Bloco infinito do servidor 
    while True: 
     # Recebe a data e o endereço da conexão 
     print("server.recvfrom(1024)",server.recvfrom(1024)) 
     data, endereço = server.recvfrom(1024) 

     # Imprime as informações da conexão 
     print("Menssagem recebida de", str(endereço)) 
     print("Recebemos do cliente:", str(data)) 

     # Vamos mandar de volta a menssagem em eco 
     resposta = "Eco=>" + str(data) 
     server.sendto(data, endereço) 

    # Fechamos o servidor 
    server.close() 

if __name__ == '__main__': 
    main() 

UDP客戶端:

# -*- coding: utf-8 -*- 
#!/usr/bin/python3 
#client UDP 
from socket import * 

def main(): 
    # Cria host e port number 
    host = "localhost" 
    port = 5000 

    # O servidor será um par endereço e port 
    server = (host, port) 

    # Criamos o socket 
    sock = socket(AF_INET, SOCK_DGRAM) 
    sock.bind((host, port)) 

    # Vamos mandar mensagem enquanto a mensagem for diferente de sair (s) 
    msg = input("-> ") 
    while msg != 's': 
     # Mandamos a mensagem através da conexão 
     sock.sendto(msg.encode(), server) 

     # Recebemos uma resposta do servidor 
     data, endereco = sock.recvfrom(1024) 

     # Imprimimos a mensagem recebida 
     print("Recebida ->", str(data)) 

     # Podemos mandar mais mensagens 
     msg = input("-> ") 

    # Fechamos a conexão 
    sock.close() 

if __name__ == '__main__': 
    main() 

的代碼工作,但我不知道什麼是服務器或客戶端:UDP服務器和UDP客戶端之間的區別:襪子.bind((主機,端口))在客戶端還是服務器端?

+2

對於UDP真的有像TCP沒有 「服務器 - 客戶端」 的關係。如果多個程序正在與中央程序通信,那麼中央程序可以稱爲「服務器」,而其他程序稱爲「客戶」。或者,如果你有一個提供*服務的程序*,那麼它可以被認爲是一個「服務器」,而其他請求這個*服務的程序*(不管它可能是什麼)都可以被認爲是客戶端。 –

+1

@JoachimPileborg,謝謝。因此,如果我調用具有sock.bind((主機,端口)「客戶端」的腳本,它會錯誤嗎?它是不可分辨的嗎? –

+2

在服務器(接收器)端;請參閱EJP的答案:http:/ /stackoverflow.com/questions/6189831/whats-the-purpose-of-using-sendto-recvfrom-instead-of-connect-send-recv-with-ud – VPfB

回答

1

作爲@VPfB回答,請參見:What's the purpose of using sendto/recvfrom instead of connect/send/recv with UDP sockets?

模型服務器/客戶端:

客戶端是iniciate通信和服務器是一個接收器的部分。

客戶:

# -*- coding: utf-8 -*- 
#!/usr/bin/python3 

from socket import * 

def main(): 
    # Cria host e port number 
    host = "localhost" 
    port = 5000 

    # O servidor será um par endereço e port 
    server = (host, port) 

    # Criamos o socket 
    sock = socket(AF_INET, SOCK_DGRAM) 
    ##sock.bind((host, port)) #server side 

    # Vamos mandar mensagem enquanto a mensagem for diferente de sair (s) 
    msg = input("-> ") 
    while msg != 's': 
     # Mandamos a mensagem através da conexão 
     sock.sendto(msg.encode(), server) #encode para enviar no formato de bytes 

     # Recebemos uma respota do servidor 
     data, endereco = sock.recvfrom(1024) 

     # Imprimimos a mensagem recebida 
     print("Recebida ->", str(data)) 

     # Podemos mandar mais mensagens 
     msg = input("-> ") 

    # Fechamos a conexão 
    sock.close() 

if __name__ == '__main__': 
    main() 

服務器:

# -*- coding: utf-8 -*- 
#!/usr/bin/python3 


from socket import * 

def main(): 
    # Cria host e port number 
    host = "" 
    port = 5000 

    # Cria socket     #UDP 
    server = socket(AF_INET, SOCK_DGRAM) 
    server.bind((host, port)) 


    # Indica que o servidor foi iniciado 
    print("Servidor iniciado") 

    # Bloco infinito do servidor 
    while True: 
     # Recebe a data e o endereço da conexão 
     print("server.recvfrom(1024)",server.recvfrom(1024)) 
     data, endereço = server.recvfrom(1024) 

     # Imprime as informações da conexão 
     print("Menssagem recebida de", str(endereço)) 
     print("Recebemos do cliente:", str(data)) 

     # Vamos mandar de volta a menssagem em eco 
     resposta = "Eco=>" + str(data) 
     server.sendto(data, endereço) 

    # Fechamos o servidor 
    server.close() 

if __name__ == '__main__': 
    main()