我正在尝试使用dagramsocket将软件包从客户端发送到服务器,但是花了几个小时在StackOverflow和官方文档中查找信息之后,我仍然收到IOException。 我有一台服务器,可以从客户端接收一个句子,更改句子并打印新句子。知道为什么它不起作用吗?这是代码:
客户:
public class YodafyClienteTCP {
public static void main(String[] args) {
byte []buferEnvio;
byte []buferRecepcion=new byte[256];
int bytesLeidos=0;
// Nombre del host donde se ejecuta el servidor:
String host="localhost";
// Puerto en el que espera el servidor:
int port=8989;
DatagramPacket paquete;
InetAddress direccion;
// Socket para la conexión TCP
DatagramSocket socketServicio;
try {
// Creamos un socket que se conecte a "host" y "port":
socketServicio=new DatagramSocket();
direccion = InetAddress.getByName(host);
buferEnvio="Al monte del volcán debes ir sin demora".getBytes();
paquete = new DatagramPacket(buferEnvio, buferEnvio.length, direccion, port);
// Enviamos el array por el socket;
socketServicio.send(paquete);
System.out.println("Paquete enviado por el cliente.");
socketServicio.close();
// Excepciones:
} catch (UnknownHostException e) {
System.err.println("Error: Nombre de host no encontrado.");
e.printStackTrace();
} catch (IOException e) {
System.err.println("Error de entrada/salida al abrir el socket.");
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}
}
更改句子的类,由服务器调用
public class ProcesadorYodafy {
// Referencia a un socket para enviar/recibir las peticiones/respuestas
private DatagramSocket socketServicio;
// Para que la respuesta sea siempre diferente, usamos un generador de números aleatorios.
private Random random;
// Constructor que tiene como parámetro una referencia al socket abierto en por otra clase
public ProcesadorYodafy(DatagramSocket socketServicio) {
this.socketServicio=socketServicio;
random=new Random();
}
// Aquí es donde se realiza el procesamiento realmente:
void procesa(){
// Como máximo leeremos un bloque de 1024 bytes. Esto se puede modificar.
byte [] datosRecibidos=new byte[1024];
int bytesRecibidos=0;
DatagramPacket paquete;
// Array de bytes para enviar la respuesta. Podemos reservar memoria cuando vayamos a enviarla:
byte [] datosEnviar;
try {
// Lee la frase a Yodaficar:
paquete = new DatagramPacket(datosRecibidos, datosRecibidos.length);
socketServicio.receive(paquete);
datosRecibidos = paquete.getData();
bytesRecibidos = datosRecibidos.length;
//yodaDo is just a method that changes some characters in the sentence
String peticion=new String(datosRecibidos,0,bytesRecibidos);
String respuesta=yodaDo(peticion);
System.out.println("Here is your new sentence : " + respuesta);
socketServicio.close();
} catch (IOException e) {
System.err.println("Error al obtener los flujos de entrada/salida.");
}
}
服务器:
public class YodafyServidorIterativo {
public static void main(String[] args) {
// Puerto de escucha
int port=8989;
// array de bytes auxiliar para recibir o enviar datos.
byte []buffer=new byte[256];
// Número de bytes leídos
int bytesLeidos=0;
//Socket
DatagramSocket socketServicio;
try {
// Abrimos el socket en modo pasivo, escuchando el en puerto indicado por "port"
socketServicio = new DatagramSocket(port);
// Mientras ... siempre!
do {
//////////////////////////////////////////////////
// Creamos un objeto de la clase ProcesadorYodafy, pasándole como
// argumento el nuevo socket, para que realice el procesamiento
// Este esquema permite que se puedan usar hebras más fácilmente.
ProcesadorYodafy procesador=new ProcesadorYodafy(socketServicio);
procesador.procesa();
} while (true);
} catch (IOException e) {
System.err.println("Error al escuchar en el puerto "+port);
}
}
}
答案 0 :(得分:0)
首先,这是UDP连接,例如提及here。寻找正确的连接,您会更快地找到需求文档。
第二,可能是您的问题,无论是什么原因,都是由以下原因引起的:
尝试设置客户端的端口,并在启动客户端之前确保服务器已启动。
答案 1 :(得分:0)
已解决。我正在关闭ProcesadorYodafy类中的datagramsocket,并且只在服务器中打开了一次套接字,因此在循环的以下迭代中,尽管我将包发送到了那里,但datagramsocket还是关闭了。谢谢大家