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











up vote
1
down vote

favorite












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 at 21:20















up vote
1
down vote

favorite












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 at 21:20













up vote
1
down vote

favorite









up vote
1
down vote

favorite











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 at 21:08

























asked Nov 13 at 22:13









Bruno 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 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 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 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 at 21:20

















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',
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






























active

oldest

votes













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.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • 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

Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

ComboBox Display Member on multiple fields

Is it possible to collect Nectar points via Trainline?