How to transfer chunks from different clients and recreate the complete file in server using Java?












1















So, I'm working on a chat with file transfer funcionality. It's kind of close to be done but I'm struggling to make the transfer like I need to.
I need to achieve the following:




if file "A" is located ONLY in client "2", then client "2" should send 100% of the file to client "1"



if file "A" is located in client "2" and client "3" also has file "A", then client "2" should send 50% of the file to client "1" and client "3" should send the other 50%.



(if the file is located in 4 clients i should be 25% each....and so it goes...)




So, I managed to make the one-to-one (100%) transfer, but now I can't make the shared many-to-one transfer.
I was trying to adapt these methods I found on the internet (I've already made a few modifications to the methods) so I could use tha variable "pos" to control how many chunks would a client send, and then I would create a dinamic int variable to keep the quantity of clients I had to share the file with and use it to control the transfer.



private static void writeFile(File file, OutputStream outStream, long fileSize) {
FileInputStream reader = null;
try {
reader = new FileInputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int pos = 0;
int bytesRead;
while ((bytesRead = reader.read(buffer, 0, CHUNK_SIZE)) >= 0) {
outStream.write(buffer, 0, bytesRead);
outStream.flush();
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");

}
} catch (IndexOutOfBoundsException e) {
System.err.println("Error while reading file");
e.printStackTrace();
} catch (IOException e) {
System.err.println("Error while writing " + file.toString() + " to output stream");
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


private static void saveFile(File file, InputStream inStream, long fileSize) {
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int bytesRead;
int pos = 0;
while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {

pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos == fileSize) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("Finished, filesize = " + file.length());
}


But that idea seems to only work for the first transfer. I changed the "while" loop in saveFile like this, so it would only save 50% of the file from the first client, and as expected I got half of the .png i was using to test.



while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos >= fileSize/2) {
break;
}
}


But I know I can't complete the .png! The second client can't send the the chuks where "(pos >= sizeFile/2)" and I get the following error when I try to do so:



java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at tor.Client.run(Client.java:109)


Line 109 is:



Socket requester = new Socket("192.168.3.114", 2007);


Can anyone bring some light to me over this problem?










share|improve this question

























  • We would probably need to see the code for the server side of this, as the error you're reporting happens before you hit any of your code here (it's an error when the client tries to connect to the server - so the question is why is the server refusing the connection request...

    – moilejter
    Nov 18 '18 at 21:20
















1















So, I'm working on a chat with file transfer funcionality. It's kind of close to be done but I'm struggling to make the transfer like I need to.
I need to achieve the following:




if file "A" is located ONLY in client "2", then client "2" should send 100% of the file to client "1"



if file "A" is located in client "2" and client "3" also has file "A", then client "2" should send 50% of the file to client "1" and client "3" should send the other 50%.



(if the file is located in 4 clients i should be 25% each....and so it goes...)




So, I managed to make the one-to-one (100%) transfer, but now I can't make the shared many-to-one transfer.
I was trying to adapt these methods I found on the internet (I've already made a few modifications to the methods) so I could use tha variable "pos" to control how many chunks would a client send, and then I would create a dinamic int variable to keep the quantity of clients I had to share the file with and use it to control the transfer.



private static void writeFile(File file, OutputStream outStream, long fileSize) {
FileInputStream reader = null;
try {
reader = new FileInputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int pos = 0;
int bytesRead;
while ((bytesRead = reader.read(buffer, 0, CHUNK_SIZE)) >= 0) {
outStream.write(buffer, 0, bytesRead);
outStream.flush();
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");

}
} catch (IndexOutOfBoundsException e) {
System.err.println("Error while reading file");
e.printStackTrace();
} catch (IOException e) {
System.err.println("Error while writing " + file.toString() + " to output stream");
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


private static void saveFile(File file, InputStream inStream, long fileSize) {
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int bytesRead;
int pos = 0;
while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {

pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos == fileSize) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("Finished, filesize = " + file.length());
}


But that idea seems to only work for the first transfer. I changed the "while" loop in saveFile like this, so it would only save 50% of the file from the first client, and as expected I got half of the .png i was using to test.



while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos >= fileSize/2) {
break;
}
}


But I know I can't complete the .png! The second client can't send the the chuks where "(pos >= sizeFile/2)" and I get the following error when I try to do so:



java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at tor.Client.run(Client.java:109)


Line 109 is:



Socket requester = new Socket("192.168.3.114", 2007);


Can anyone bring some light to me over this problem?










share|improve this question

























  • We would probably need to see the code for the server side of this, as the error you're reporting happens before you hit any of your code here (it's an error when the client tries to connect to the server - so the question is why is the server refusing the connection request...

    – moilejter
    Nov 18 '18 at 21:20














1












1








1








So, I'm working on a chat with file transfer funcionality. It's kind of close to be done but I'm struggling to make the transfer like I need to.
I need to achieve the following:




if file "A" is located ONLY in client "2", then client "2" should send 100% of the file to client "1"



if file "A" is located in client "2" and client "3" also has file "A", then client "2" should send 50% of the file to client "1" and client "3" should send the other 50%.



(if the file is located in 4 clients i should be 25% each....and so it goes...)




So, I managed to make the one-to-one (100%) transfer, but now I can't make the shared many-to-one transfer.
I was trying to adapt these methods I found on the internet (I've already made a few modifications to the methods) so I could use tha variable "pos" to control how many chunks would a client send, and then I would create a dinamic int variable to keep the quantity of clients I had to share the file with and use it to control the transfer.



private static void writeFile(File file, OutputStream outStream, long fileSize) {
FileInputStream reader = null;
try {
reader = new FileInputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int pos = 0;
int bytesRead;
while ((bytesRead = reader.read(buffer, 0, CHUNK_SIZE)) >= 0) {
outStream.write(buffer, 0, bytesRead);
outStream.flush();
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");

}
} catch (IndexOutOfBoundsException e) {
System.err.println("Error while reading file");
e.printStackTrace();
} catch (IOException e) {
System.err.println("Error while writing " + file.toString() + " to output stream");
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


private static void saveFile(File file, InputStream inStream, long fileSize) {
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int bytesRead;
int pos = 0;
while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {

pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos == fileSize) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("Finished, filesize = " + file.length());
}


But that idea seems to only work for the first transfer. I changed the "while" loop in saveFile like this, so it would only save 50% of the file from the first client, and as expected I got half of the .png i was using to test.



while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos >= fileSize/2) {
break;
}
}


But I know I can't complete the .png! The second client can't send the the chuks where "(pos >= sizeFile/2)" and I get the following error when I try to do so:



java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at tor.Client.run(Client.java:109)


Line 109 is:



Socket requester = new Socket("192.168.3.114", 2007);


Can anyone bring some light to me over this problem?










share|improve this question
















So, I'm working on a chat with file transfer funcionality. It's kind of close to be done but I'm struggling to make the transfer like I need to.
I need to achieve the following:




if file "A" is located ONLY in client "2", then client "2" should send 100% of the file to client "1"



if file "A" is located in client "2" and client "3" also has file "A", then client "2" should send 50% of the file to client "1" and client "3" should send the other 50%.



(if the file is located in 4 clients i should be 25% each....and so it goes...)




So, I managed to make the one-to-one (100%) transfer, but now I can't make the shared many-to-one transfer.
I was trying to adapt these methods I found on the internet (I've already made a few modifications to the methods) so I could use tha variable "pos" to control how many chunks would a client send, and then I would create a dinamic int variable to keep the quantity of clients I had to share the file with and use it to control the transfer.



private static void writeFile(File file, OutputStream outStream, long fileSize) {
FileInputStream reader = null;
try {
reader = new FileInputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int pos = 0;
int bytesRead;
while ((bytesRead = reader.read(buffer, 0, CHUNK_SIZE)) >= 0) {
outStream.write(buffer, 0, bytesRead);
outStream.flush();
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");

}
} catch (IndexOutOfBoundsException e) {
System.err.println("Error while reading file");
e.printStackTrace();
} catch (IOException e) {
System.err.println("Error while writing " + file.toString() + " to output stream");
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


private static void saveFile(File file, InputStream inStream, long fileSize) {
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(file);
byte buffer = new byte[CHUNK_SIZE];
int bytesRead;
int pos = 0;
while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {

pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos == fileSize) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("Finished, filesize = " + file.length());
}


But that idea seems to only work for the first transfer. I changed the "while" loop in saveFile like this, so it would only save 50% of the file from the first client, and as expected I got half of the .png i was using to test.



while ((bytesRead = inStream.read(buffer, 0, CHUNK_SIZE)) >= 0) {
pos += bytesRead;
System.out.println(pos + " bytes (" + bytesRead + " bytes read)");
fileOut.write(buffer, 0, bytesRead);

if (pos >= fileSize/2) {
break;
}
}


But I know I can't complete the .png! The second client can't send the the chuks where "(pos >= sizeFile/2)" and I get the following error when I try to do so:



java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at tor.Client.run(Client.java:109)


Line 109 is:



Socket requester = new Socket("192.168.3.114", 2007);


Can anyone bring some light to me over this problem?







java file sockets output transfer






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 18 '18 at 21:08







Bruno Lira

















asked Nov 13 '18 at 22:13









Bruno LiraBruno Lira

112




112













  • We would probably need to see the code for the server side of this, as the error you're reporting happens before you hit any of your code here (it's an error when the client tries to connect to the server - so the question is why is the server refusing the connection request...

    – moilejter
    Nov 18 '18 at 21:20



















  • We would probably need to see the code for the server side of this, as the error you're reporting happens before you hit any of your code here (it's an error when the client tries to connect to the server - so the question is why is the server refusing the connection request...

    – moilejter
    Nov 18 '18 at 21:20

















We would probably need to see the code for the server side of this, as the error you're reporting happens before you hit any of your code here (it's an error when the client tries to connect to the server - so the question is why is the server refusing the connection request...

– moilejter
Nov 18 '18 at 21:20





We would probably need to see the code for the server side of this, as the error you're reporting happens before you hit any of your code here (it's an error when the client tries to connect to the server - so the question is why is the server refusing the connection request...

– moilejter
Nov 18 '18 at 21:20












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290304%2fhow-to-transfer-chunks-from-different-clients-and-recreate-the-complete-file-in%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290304%2fhow-to-transfer-chunks-from-different-clients-and-recreate-the-complete-file-in%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Xamarin.iOS Cant Deploy on Iphone

Glorious Revolution

Dulmage-Mendelsohn matrix decomposition in Python