mirror of
https://github.com/binlaab/nanofiles.git
synced 2026-07-01 18:16:29 +02:00
uwu
This commit is contained in:
@@ -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
|
||||||
@@ -129,6 +130,18 @@ 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;
|
||||||
|
|||||||
@@ -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,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() {
|
public InetSocketAddress getServerAddr() {
|
||||||
return serverAddr;
|
return serverAddr;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
39
es/um/redes/nanoFiles/tcp/message/PeerMessageTest.java
Normal file
39
es/um/redes/nanoFiles/tcp/message/PeerMessageTest.java
Normal 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!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -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,14 +202,37 @@ public class NFServer implements Runnable {
|
|||||||
|
|
||||||
InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress();
|
InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress();
|
||||||
try {
|
try {
|
||||||
while(true) {
|
|
||||||
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
|
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
|
||||||
DataInputStream dis = new DataInputStream(socket.getInputStream());
|
DataInputStream dis = new DataInputStream(socket.getInputStream());
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user