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 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,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() {

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,13 +202,36 @@ 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

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