This commit is contained in:
2026-04-25 14:26:35 +02:00
parent c0fb933fce
commit 0cf758943b
10 changed files with 216 additions and 88 deletions

View File

@@ -1,39 +1,39 @@
práctica 2 práctica 2
1. hecho 1. hecho
2. hecho 2. hecho
3. hecho 3. hecho
4. hecho 4. hecho
práctica 3 práctica 3
1. hecho 1. hecho
2. hecho 2. hecho
3. hecho 3. hecho
4. hecho 4. hecho
práctica 4 práctica 4
1. hecho 1. hecho
2. hecho 2. hecho
1. hecho? 1. hecho?
2. hecho 2. hecho
3. hecho 3. hecho
4. hecho 4. hecho
5. hecho 5. hecho
6. hecho 6. hecho
7. hecho a medias, faltan todos los comandos 7. hecho a medias, faltan todos los comandos
8. no 8. no
mirar TODOs en DirMessage, DirMessageOps y NFDirectoryServer mirar TODOs en DirMessage, DirMessageOps y NFDirectoryServer
práctica 5 - hecho, revisarlo práctica 5 - hecho, revisarlo
mirar TODOs en NFController mirar TODOs en NFController
práctica 6 práctica 6
1 - 3. hechos 1 - 3. hechos
4- fin. no 4- fin. no
práctica 7 práctica 7
especialmente el 9, los demás son pruebas especialmente el 9, los demás son pruebas
práctica 8 práctica 8
parcialmente implementados todos los ejercicios parcialmente implementados todos los ejercicios

View File

@@ -9,6 +9,7 @@ import es.um.redes.nanoFiles.application.NanoFiles;
import es.um.redes.nanoFiles.tcp.server.NFServer; import es.um.redes.nanoFiles.tcp.server.NFServer;
import es.um.redes.nanoFiles.util.FileInfo;
public class NFControllerLogicP2P { public class NFControllerLogicP2P {
// Servidor TCP local para compartir ficheros con otros peers // Servidor TCP local para compartir ficheros con otros peers
@@ -101,7 +102,7 @@ public class NFControllerLogicP2P {
assert (NanoFiles.testModeTCP); assert (NanoFiles.testModeTCP);
/* /*
* (Boletín SocketsTCP) Inicialmente, se creará un NFConnector (cliente TCP) * (Boletín SocketsTCP) Inicialmente, se creará un NFConnector (cliente TCP)
* para conectarse a un servidor que esté escuchando en la m isma máquina y un * para conectarse a un servidor que esté escuchando en la misma máquina y un
* puerto fijo. Después, se ejecutará el método "test" para comprobar la * puerto fijo. Después, se ejecutará el método "test" para comprobar la
* comunicación mediante el socket TCP. Posteriormente, se desactivará * comunicación mediante el socket TCP. Posteriormente, se desactivará
* "testModeTCP" para implementar la descarga de un fichero desde múltiples * "testModeTCP" para implementar la descarga de un fichero desde múltiples
@@ -128,7 +129,19 @@ public class NFControllerLogicP2P {
*/ */
protected boolean listPeerFiles(InetSocketAddress peerAddr) { protected boolean listPeerFiles(InetSocketAddress peerAddr) {
boolean success = false; boolean success = false;
try {
NFConnector nfc = new NFConnector(peerAddr);
FileInfo[] filelist = nfc.getFileList();
if (filelist == null) return success;
System.out.println("Files available in peer: ");
FileInfo.printToSysout(filelist);
success = true;
} catch (IOException e) {}
return success; return success;

View File

@@ -9,6 +9,7 @@ import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.LinkedList;
import es.um.redes.nanoFiles.tcp.message.PeerMessage; import es.um.redes.nanoFiles.tcp.message.PeerMessage;
import es.um.redes.nanoFiles.tcp.message.PeerMessageOps; import es.um.redes.nanoFiles.tcp.message.PeerMessageOps;
@@ -35,8 +36,10 @@ public class NFConnector {
* partir de los streams de entrada/salida del socket creado. Se usarán para * partir de los streams de entrada/salida del socket creado. Se usarán para
* enviar (dos) y recibir (dis) datos del servidor. * enviar (dos) y recibir (dis) datos del servidor.
*/ */
try {
socket = new Socket(serverAddr.getAddress(), serverAddr.getPort()); socket = new Socket(fserverAddr.getAddress(), fserverAddr.getPort());
} catch (Exception e) { e.printStackTrace(); }
dis = new DataInputStream(socket.getInputStream()); dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream()); dos = new DataOutputStream(socket.getOutputStream());
@@ -57,11 +60,11 @@ public class NFConnector {
System.out.println("received " + intNumber); System.out.println("received " + intNumber);
*/ */
try { try {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES); PeerMessage msgOut = new PeerMessage((byte) 1);
msgOut.writeMessageToOutputStream(dos); msgOut.writeMessageToOutputStream(dos);
System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode())); System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode()));
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis); PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
System.out.println("received " + PeerMessageOps.opcodeToOperation(msgIn.getOpcode())); System.out.println("received " + msgIn.getOpcode() + " " + PeerMessageOps.opcodeToOperation(msgIn.getOpcode()));
System.out.println("(" + new SimpleDateFormat("HH:mm:ss:SS").format(new Date())); System.out.println("(" + new SimpleDateFormat("HH:mm:ss:SS").format(new Date()));
if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) { if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) {
System.out.println("file content: "); System.out.println("file content: ");
@@ -76,7 +79,29 @@ public class NFConnector {
} }
public FileInfo[] getFileList() {
try {
LinkedList<FileInfo> filelist = new LinkedList<>();
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES);
msgOut.writeMessageToOutputStream(dos);
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) {
boolean last = false;
while (!last) {
long size = msgIn.getFileSize();
String hash = msgIn.getFileHash();
String name = msgIn.getFilenameVal();
FileInfo file = new FileInfo(hash, name, size, null);
filelist.add(file);
last = msgIn.getLast();
if (!last) msgIn = PeerMessage.readMessageFromInputStream(dis); // tengo que ver si puedo hacerlo diferente
}
} else { return null; }
return filelist.toArray(new FileInfo[0]);
} catch (IOException e) { e.printStackTrace(); return null; }
}
public InetSocketAddress getServerAddr() { public InetSocketAddress getServerAddr() {

View File

@@ -107,12 +107,13 @@ public class PeerMessage {
* Usar dis.readFully para leer un array de bytes, dis.readInt para leer un * Usar dis.readFully para leer un array de bytes, dis.readInt para leer un
* entero, etc. * entero, etc.
*/ */
PeerMessage message = new PeerMessage();
byte opcode = dis.readByte(); byte opcode = dis.readByte();
PeerMessage message = new PeerMessage(opcode);
switch (opcode) { switch (opcode) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES: case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break; case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break;
case PeerMessageOps.OPCODE_PEER_FILE: { case PeerMessageOps.OPCODE_PEER_FILE: {
boolean last = false; boolean last = false;
byte lastVal = dis.readByte(); byte lastVal = dis.readByte();
@@ -134,6 +135,7 @@ public class PeerMessage {
message.setFileHash(new String(fileHash)); message.setFileHash(new String(fileHash));
message.setFilenameLong(filenameLong); message.setFilenameLong(filenameLong);
message.setFilenameVal(new String(filenameVal)); message.setFilenameVal(new String(filenameVal));
break;
} }
@@ -156,6 +158,7 @@ public class PeerMessage {
*/ */
dos.writeByte(opcode); dos.writeByte(opcode);
System.out.println(opcode);
switch (opcode) { switch (opcode) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES: case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break; case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break;

View File

@@ -0,0 +1,39 @@
package es.um.redes.nanoFiles.tcp.message;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class PeerMessageTest {
public static void main(String[] args) throws IOException {
String nombreArchivo = "peermsg.bin";
DataOutputStream fos = new DataOutputStream(new FileOutputStream(nombreArchivo));
/*
* TODO: Probar a crear diferentes tipos de mensajes (con los opcodes válidos
* definidos en PeerMessageOps), estableciendo los atributos adecuados a cada
* tipo de mensaje. Luego, escribir el mensaje a un fichero con
* writeMessageToOutputStream para comprobar que readMessageFromInputStream
* construye un mensaje idéntico al original.
*/
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES);
msgOut.writeMessageToOutputStream(fos);
DataInputStream fis = new DataInputStream(new FileInputStream(nombreArchivo));
PeerMessage msgIn = PeerMessage.readMessageFromInputStream((DataInputStream) fis);
/*
* TODO: Comprobar que coinciden los valores de los atributos relevantes al tipo
* de mensaje en ambos mensajes (msgOut y msgIn), empezando por el opcode.
*/
if (msgOut.getOpcode() != msgIn.getOpcode()) {
System.out.println(msgOut.getOpcode() + " " + msgIn.getOpcode());
System.err.println("Opcode does not match!");
}
}
}

View File

@@ -7,6 +7,11 @@ import java.net.InetSocketAddress;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import es.um.redes.nanoFiles.application.NanoFiles;
import es.um.redes.nanoFiles.tcp.message.PeerMessage;
import es.um.redes.nanoFiles.tcp.message.PeerMessageOps;
import es.um.redes.nanoFiles.util.FileInfo;
@@ -78,12 +83,26 @@ public class NFServer implements Runnable {
DataInputStream dis = new DataInputStream(socket.getInputStream()); DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
int intNumber = dis.readInt(); /* int intNumber = dis.readInt();
System.out.println("received " + intNumber); System.out.println("received " + intNumber);
int newInt = intNumber + 1; int newInt = intNumber + 1;
dos.writeInt(newInt); dos.writeInt(newInt);
System.out.println("sent " + newInt); System.out.println("sent " + newInt); */
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
System.out.println("received " + msgIn.getOpcode() + " " + PeerMessageOps.opcodeToOperation(msgIn.getOpcode()));
if (msgIn.getOpcode() == PeerMessageOps.OPCODE_REQUEST_PEER_FILES) {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_PEER_FILE);
msgOut.setLast(true);
msgOut.setFileSize(62);
msgOut.setFileHash("abcdefghijklmnoprqstuvwxyzaaaaaaaaaaaaaa");
msgOut.setFilenameLong((byte) 10);
msgOut.setFilenameVal("prueba.txt");
msgOut.writeMessageToOutputStream(dos);
System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode()));
}
} catch (IOException e) { } catch (IOException e) {
// ??????? // ???????
} }
@@ -183,13 +202,36 @@ public class NFServer implements Runnable {
InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress(); InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress();
try { try {
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
while(true) { while(true) {
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream()); PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
switch (msgIn.getOpcode()) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
FileInfo[] archivos = NanoFiles.db.getFiles();
for (int i = 0; i < archivos.length; i++) {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_PEER_FILE);
FileInfo archivo = archivos[i];
msgOut.setFileHash(archivo.fileHash);
msgOut.setFileSize(archivo.fileSize);
msgOut.setFilenameVal(archivo.fileName);
msgOut.setFilenameLong((byte)archivo.fileName.length());
msgOut.setLast(false);
if (i == archivos.length - 1) msgOut.setLast(true);
msgOut.writeMessageToOutputStream(dos);
}
}
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@@ -1,29 +1,29 @@
package es.um.redes.nanoFiles.tcp.server; package es.um.redes.nanoFiles.tcp.server;
import java.net.Socket; import java.net.Socket;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class NFServerState { public class NFServerState {
private int numberOfConnections; private int numberOfConnections;
private ArrayList<Socket> sockets; private ArrayList<Socket> sockets;
public NFServerState() { public NFServerState() {
numberOfConnections = 0; numberOfConnections = 0;
sockets = new ArrayList<>(); sockets = new ArrayList<>();
} }
public int getNumberOfConnections() { public int getNumberOfConnections() {
return numberOfConnections; return numberOfConnections;
} }
public List<Socket> getSockets() { public List<Socket> getSockets() {
// tu puta madre va a hacer copias // tu puta madre va a hacer copias
return sockets; return sockets;
} }
public void updateState(Socket socket) { public void updateState(Socket socket) {
sockets.add(socket); sockets.add(socket);
numberOfConnections++; numberOfConnections++;
} }
} }

View File

@@ -289,7 +289,15 @@ public class DirectoryConnector {
* de la operación * de la operación
*/ */
DirMessage serve = new DirMessage(DirMessageOps.OPERATION_SERVE, NanoFiles.peerNickname, this.directoryHostname, serverPort); // este trozo hay que cambiarlo porque qué cojones
String ip = null;
try {
socket.connect(directoryAddress);
ip = socket.getLocalAddress().getHostAddress();
socket.disconnect();
} catch(Exception e) {}
DirMessage serve = new DirMessage(DirMessageOps.OPERATION_SERVE, NanoFiles.peerNickname, ip, serverPort);
byte[] serveBytes = serve.toString().getBytes(); byte[] serveBytes = serve.toString().getBytes();
byte[] response = sendAndReceiveDatagrams(serveBytes); byte[] response = sendAndReceiveDatagrams(serveBytes);
String respStr = new String(response, 0, response.length); String respStr = new String(response, 0, response.length);

View File

@@ -193,19 +193,16 @@ public class DirMessage {
} }
case FIELDNAME_NICK: { case FIELDNAME_NICK: {
System.out.println("nick");
m.setNick(value); m.setNick(value);
break; break;
} }
case FIELDNAME_IP: { case FIELDNAME_IP: {
System.out.println("ip");
m.setIP(value); m.setIP(value);
break; break;
} }
case FIELDNAME_PORT: { case FIELDNAME_PORT: {
System.out.println("port " + Integer.parseInt(value));
m.setPort(Integer.parseInt(value)); m.setPort(Integer.parseInt(value));
break; break;
} }
@@ -225,14 +222,16 @@ public class DirMessage {
} }
case FIELDNAME_PEERS: { case FIELDNAME_PEERS: {
System.out.println("Hemos entrado a FIELDNAME_PEERS");
Map<String, InetSocketAddress> peersList = new LinkedHashMap<>(); Map<String, InetSocketAddress> peersList = new LinkedHashMap<>();
String[] peers = value.split(","); String[] peers = value.split(",");
for (String p: peers) { if (peers[0].isBlank()) {
String[] partes = p.split(":"); m.setPeers(peersList);
peersList.put(partes[0], new InetSocketAddress(partes[1], Integer.parseInt(partes[2]))); break;
System.out.println("DirMessage - partes[0]: " + partes[0]);
} }
for (String p: peers) {
System.out.println("p: " + p);
String[] partes = p.split(":");
peersList.put(partes[0], new InetSocketAddress(partes[1], Integer.parseInt(partes[2]))); }
m.setPeers(peersList); m.setPeers(peersList);
break; break;

View File

@@ -255,7 +255,6 @@ public class NFDirectoryServer {
case DirMessageOps.OPERATION_SERVE: { case DirMessageOps.OPERATION_SERVE: {
if (registeredPeers.put(receivedMsg.getNick(), new InetSocketAddress(receivedMsg.getIP(), receivedMsg.getPort())) == null) { if (registeredPeers.put(receivedMsg.getNick(), new InetSocketAddress(receivedMsg.getIP(), receivedMsg.getPort())) == null) {
System.out.println("NFDS - añadido peer");
msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_OK); msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_OK);
} else { } else {
msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_ERROR); msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_ERROR);