Я хочу послать список чисел в сервер для того, чтобы он был, прочитав их, осуществите соответствующие операции и возвратите результат тех же самых клиенту. Потом он вновь будет просить у клиента числа и снова возвратит ему соответствующий результат, повторяясь процесс до тех пор, пока клиент не введет один *, тогда там закрылась бы связь с сервером. Я должен делать это обязательно используя протокол UDP.
Проблема состоит, в том, что послав числа по-видимому в сервер, к нему не прибывают вышеупомянутые числа, и он ничего не делает. Когда я выполняю программу, он просит у меня 4 числа, я ввожу их и там он, где он остается слабым, сервер не возвращает никакого результата. Чтобы сохранять числа я использовал ArrayList число... проблема - процесс, чтобы упаковывать этот список чисел в байт, это посылать в сервер, и что этот это декодировал и читал эти числа, там по-видимому к нему не прибывает информация в сервер. Я - новичок в этом связей TCP/UDP, конечно, что я ошибусь, но не знаю, как решать это, надеюсь, что вы можете ориентировать меня немного, потому что я более потерян, чем осьминог в гараже.
Код сервера есть:
import java.awt.List;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;
public class Servidor {
public static void main(String args[]) throws Exception {
DatagramSocket serverSocket = new DatagramSocket(9886);
byte[] infoRecibida = new byte[1024];
byte[] infoEnviada = new byte[1024];
byte[] paquete = new byte[1024];
String cadena;
List list;
int n1,n2,n3,n4;
int res;
String num;
String num1,num2,num3,num4;
String x;
while (true) {
System.out.println("Esperando datagrama...");
infoRecibida = new byte[1024];
DatagramPacket paqRecibido = new DatagramPacket(infoRecibida, infoRecibida.length);
serverSocket.receive(paqRecibido);
// IP y puerto desde donde se manda mensaje
InetAddress IPOrigen = paqRecibido.getAddress();
int puerto = paqRecibido.getPort();
//Estas dos lineas supuestamente serían para poder leer el arraylist enviado desde el cliente, aunque igual estoy equivocado
ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(infoRecibida));
ArrayList<Integer> numeros = (ArrayList<Integer>)inputStream.readObject();
n1 = numeros.get(0);
n2 = numeros.get(1);
n3 = numeros.get(2);
n4 = numeros.get(3);
num1= Integer.toString(n1);
num2= Integer.toString(n2);
num3= Integer.toString(n3);
num4= Integer.toString(n4);
// Si alguno de los números introducidos es *
// envío "x" al cliente para que este se cierre, posteriormente sale del bucle y se cierra también el servidor
if (num1=="*"||num2=="*"||num3=="*"||num4=="*") {
x = "x";
paquete = x.getBytes();
DatagramPacket paqueteFinal = new DatagramPacket(paquete, paquete.length, IPOrigen, puerto);
break;
}
//Hago las operaciones, el resultado lo paso a cadena y luego a bytes, para ser enviado al cliente
res=(n1+n2)*n3-n4;
num = Integer.toString(res);
infoEnviada=num.getBytes();
// ENVIO DATAGRAMA AL CLIENTE
DatagramPacket paqEnviado = new DatagramPacket(infoEnviada, infoEnviada.length, IPOrigen, puerto);
serverSocket.send(paqEnviado);
} //Fin While
serverSocket.close();
System.out.println("Socket cerrado...");
}
}
И тот этого Клиента
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;
public class Cliente {
public static void main(String[] args) throws Exception {
String cadena;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
//para recibir y enviar datos
byte[] datosEnviados = new byte[1024];
byte[] datosRecibidos = new byte[1024];
InetAddress IPServidor = InetAddress.getByName(...); //En el paréntesis iría el número de ip del servidor adonde quiero mandarlo
int puerto = 6000;
ArrayList<Integer> numeros = new ArrayList<>();
while(true) {
//Rellenamos ArrayList numeros
for(int i=0; i<4;i++) {
System.out.println("Introduce un mensaje: ");
cadena = in.readLine();
numeros.add(Integer.parseInt(cadena));
}
//Empaquetamos ArrayList en bytes para poder enviarlo al servidor
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(out);
outputStream.writeObject(numeros);
byte[] listData = out.toByteArray();
DatagramPacket envio = new DatagramPacket(listData, listData.length, IPServidor, puerto);
clientSocket.send(envio);
outputStream.close();
//recibimos respuesta del servidor
DatagramPacket recibo = new DatagramPacket(datosRecibidos, datosRecibidos.length);
System.out.println("Esperando datagrama...");
clientSocket.receive(recibo);
String numero = new String(recibo.getData());
//Si el dato que devuelve el servidor es "x", salimos del bucle y se cierra el cliente
if (numero.equals("x")) {
break;
}
System.out.println("\t Datos: " + numero);
} //Fin While
clientSocket.close(); //Cerramos cliente
}
}