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

@@ -9,6 +9,7 @@ import es.um.redes.nanoFiles.application.NanoFiles;
import es.um.redes.nanoFiles.tcp.server.NFServer;
import es.um.redes.nanoFiles.util.FileInfo;
public class NFControllerLogicP2P {
// Servidor TCP local para compartir ficheros con otros peers
@@ -101,7 +102,7 @@ public class NFControllerLogicP2P {
assert (NanoFiles.testModeTCP);
/*
* (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
* comunicación mediante el socket TCP. Posteriormente, se desactivará
* "testModeTCP" para implementar la descarga de un fichero desde múltiples
@@ -129,6 +130,18 @@ public class NFControllerLogicP2P {
protected boolean listPeerFiles(InetSocketAddress peerAddr) {
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;

View File

@@ -9,6 +9,7 @@ import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import es.um.redes.nanoFiles.tcp.message.PeerMessage;
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
* 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());
dos = new DataOutputStream(socket.getOutputStream());
@@ -57,11 +60,11 @@ public class NFConnector {
System.out.println("received " + intNumber);
*/
try {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES);
PeerMessage msgOut = new PeerMessage((byte) 1);
msgOut.writeMessageToOutputStream(dos);
System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode()));
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()));
if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) {
System.out.println("file content: ");
@@ -76,8 +79,30 @@ 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() {
return serverAddr;

View File

@@ -107,12 +107,13 @@ public class PeerMessage {
* Usar dis.readFully para leer un array de bytes, dis.readInt para leer un
* entero, etc.
*/
PeerMessage message = new PeerMessage();
byte opcode = dis.readByte();
PeerMessage message = new PeerMessage(opcode);
switch (opcode) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break;
case PeerMessageOps.OPCODE_PEER_FILE: {
boolean last = false;
byte lastVal = dis.readByte();
@@ -134,6 +135,7 @@ public class PeerMessage {
message.setFileHash(new String(fileHash));
message.setFilenameLong(filenameLong);
message.setFilenameVal(new String(filenameVal));
break;
}
@@ -156,6 +158,7 @@ public class PeerMessage {
*/
dos.writeByte(opcode);
System.out.println(opcode);
switch (opcode) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
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.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());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
int intNumber = dis.readInt();
/* int intNumber = dis.readInt();
System.out.println("received " + intNumber);
int newInt = intNumber + 1;
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) {
// ???????
}
@@ -183,14 +202,37 @@ public class NFServer implements Runnable {
InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress();
try {
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
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) {
e.printStackTrace();
}
}

View File

@@ -289,7 +289,15 @@ public class DirectoryConnector {
* 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[] response = sendAndReceiveDatagrams(serveBytes);
String respStr = new String(response, 0, response.length);

View File

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

View File

@@ -255,7 +255,6 @@ public class NFDirectoryServer {
case DirMessageOps.OPERATION_SERVE: {
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);
} else {
msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_ERROR);