Índice
Introdução:
Neste blog, apresentaremos como usar o servidor Java para enviar e receber mensagens UDP e lidar com solicitações simultâneas por meio de multithreading. UDP (User Datagram Protocol) é um protocolo de transmissão sem conexão e não confiável, adequado para cenários de aplicação com altos requisitos de tempo real, como jogos em tempo real e comunicação de voz.
etapa:
1. Importe as bibliotecas necessárias
Primeiro, precisamos importar a biblioteca de programação de rede fornecida pelo Java, incluindo java.net
e java.io
.
2. Crie código do lado do servidor
No lado do servidor, precisamos criar um objeto Socket e vinculá-lo à porta especificada. Em seguida, crie um loop infinito no qual a solicitação do cliente seja recebida e processada adequadamente. Como o UDP não tem conexão, podemos DatagramSocket
fazer isso por meio de classes.
3. Crie o código do cliente
No lado do cliente, também precisamos criar um objeto Socket e especificar o endereço IP e o número da porta do servidor. Em seguida, envie e receba datagramas UDP por meio do objeto Socket.
4. Implementar multithreading
Se quisermos que o servidor seja capaz de lidar com solicitações de vários clientes, podemos usar multithreading para obter processamento simultâneo. Sempre que uma nova solicitação chega ao servidor, um novo thread é criado para tratar a solicitação.
5. Teste
Depois que o código do servidor e do cliente estiver concluído, podemos executá-los separadamente e observar a saída do console. Certifique-se de que o servidor possa receber a mensagem enviada pelo cliente e processá-la corretamente.
Código de amostra:
A seguir está um exemplo de código Java simples que demonstra como implementar o envio e recebimento de mensagens UDP (multithread):
// 服务器端代码
import java.io.*;
import java.net.*;
public class UDPServer {
public static void main(String args[]) throws Exception {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData;
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}
}
// 客户端代码
import java.io.*;
import java.net.*;
public class UDPClient {
public static void main(String args[]) throws Exception {
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData;
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
descrição da função
Claro, aqui está uma descrição mais detalhada da interface de classe e função:
Descrição do código do lado do servidor:
-
DatagramSocket
Classe: Representa um soquete para envio e recebimento de datagramas UDP. Possui os seguintes métodos comuns:DatagramSocket(int port)
: crie um objeto DatagramSocket vinculado à porta especificada.void receive(DatagramPacket p)
: Armazene o datagrama UDP recebido no objeto DatagramPacket fornecido.void send(DatagramPacket p)
: Envia um datagrama UDP no objeto DatagramPacket fornecido.
-
DatagramPacket
Classe: Representa um datagrama UDP. Possui os seguintes métodos comuns:DatagramPacket(byte[] buf, int length)
: Crie um objeto DatagramPacket com comprimento especificado para receber dados.DatagramPacket(byte[] buf, int length, InetAddress address, int port)
: Crie um objeto DatagramPacket com um comprimento especificado, que é usado para enviar dados para o endereço IP e número de porta especificados.byte[] getData()
: Retorna os dados recebidos ou enviados.InetAddress getAddress()
: Retorna o endereço IP do host remoto.int getPort()
: Retorna o número da porta do host remoto.
-
String
Classe: Representa um objeto string. Possui os seguintes métodos comuns:String(byte[] bytes)
: cria um novo objeto string usando a matriz de bytes especificada.String(byte[] bytes, int offset, int length)
: cria um novo objeto string usando uma parte da matriz de bytes especificada.byte[] getBytes()
: converte uma string em uma matriz de bytes.
Descrição do código do cliente:
-
BufferedReader
Classe: Um buffer para leitura de dados de texto de um fluxo de entrada. Possui os seguintes métodos comuns:BufferedReader(Reader reader)
: crie um novo leitor em buffer.String readLine()
: Leia uma linha de texto e retorne-a.
-
InputStreamReader
Classe: Uma ponte que converte fluxos de bytes em fluxos de caracteres. Possui os seguintes construtores comuns:InputStreamReader(InputStream in)
: cria um leitor de fluxo de entrada que converte um fluxo de bytes em um fluxo de caracteres.
-
DatagramSocket
Para descrições de classes eDatagramPacket
classes, consulte a explicação no código do lado do servidor.
Espero que essas descrições detalhadas da interface de classes e funções possam ajudá-lo a entender e aplicar melhor o processo de implementação de envio e recebimento de mensagens UDP (multithreading). Se você tiver alguma dúvida, fique à vontade para perguntar.
Resumir:
No código do lado do servidor, usamos classes DatagramSocket
e DatagramPacket
para lidar com envio e recebimento de UDP. No código do cliente, usamos BufferedReader
a classe and InputStreamReader
para ler a entrada do usuário e a classe DatagramSocket
and DatagramPacket
para enviar e receber datagramas UDP.
Através deste blog, aprendemos como usar o servidor Java para enviar e receber mensagens UDP e lidar com solicitações simultâneas de maneira multithread. Isto é muito útil para cenários de aplicação com altos requisitos de tempo real, como desenvolvimento de jogos, comunicação de voz, etc. Espero que este artigo possa ajudá-lo a compreender e aplicar a programação de redes UDP. Se você tiver alguma dúvida, fique à vontade para deixar uma mensagem.