Thread View: be.comp.programming
4 messages
4 total messages
Started by Pieter Vandewoestyne
Sat, 20 Jan 2007 16:03
client/server file transfer in java
Author: Pieter Vandewoestyne
Date: Sat, 20 Jan 2007 16:03
Date: Sat, 20 Jan 2007 16:03
94 lines
3995 bytes
3995 bytes
Hoi,
Ik probeer een client/server applicatie te schrijven die een bestand van de
client uploadt naar de server.
Het probleem hierbij is dat ik in de code van mijn server zelf de
bestandsgrootte hard gecodeerd moet meegeven.
Hoe zou ik er voor kunnen zorgen dat de server zelf weet wat de
bestandsgrootte zal zijn van het bestand dat binnenkomt?
Mijn code ziet er als volgt uit:
SERVER
----------
class fserver {
public static void main(String [] args ) throws IOException {
int filesize=10722; // filesize temporary hardcoded
// create socket
ServerSocket servsock = new ServerSocket(1111);
System.out.println("Waiting for connection...");
Socket sock = servsock.accept();
System.out.println("Accepted connection");
byte [] mybytearray = new byte [filesize];
BufferedInputStream bis = new
BufferedInputStream(sock.getInputStream(),filesize);
// bis.read(mybytearray,0,mybytearray.length);
int bytesRead = 0;
while ( bytesRead < filesize ) {
int off = bytesRead;
int len = filesize - bytesRead;
int readCount = bis.read( mybytearray, off, len );
if ( readCount == -1 ) { // chech for EOF
System.err.println( "unexpected EOF" );
System.exit( 1 );
}
bytesRead += readCount;
}
FileOutputStream fos = new FileOutputStream("C:\\briefcopy.doc");
BufferedOutputStream bos = new BufferedOutputStream(fos);
fos.write(mybytearray,0,mybytearray.length);
// cleanup after file transfer
sock.close();
servsock.close();
}
}
CLIENT
-----------
class fclient {
public static void main (String [] args ) throws IOException {
// create socket
Socket sock = new Socket("127.0.0.1",1111);
System.out.println("Connecting...");
// get the file handle to send
File myFile = new File( "C:\\brief.doc" );
byte [] mybytearray = new byte [(int)myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
OutputStream os;
DataOutputStream dos;
os=sock.getOutputStream();
dos=new DataOutputStream(os);
System.out.println("Sending...");
dos.write(mybytearray,0,mybytearray.length);
// cleanup
sock.close();
}
}
-------------------------------------------------------------------
Alvast bedankt,
Pieter
Re: client/server file transfer in java
Author: An Ony
Date: Mon, 22 Jan 2007 22:20
Date: Mon, 22 Jan 2007 22:20
103 lines
4448 bytes
4448 bytes
Je moet je helemaal niets aantrekken van die filesize?
Schrijven doe je in blokken van 2^n byte-arrays tot er niets meer komt.
Een write geeft normaal gezien ook nog eens het aantal effectief geschreven bytes terug. Hetzelfde met een receive: zo weet je
meteen hoe groot je array moet zijn, als je variabele lengtes zou gebruiken voor je array.
btw: kijk eens naar java.net.DatagramPacket en DatagramSocket
"Pieter Vandewoestyne" <pieter.vandewoestyne@howest.be> wrote in message news:r3rsh.300661$W33.6038622@phobos.telenet-ops.be...
> Hoi,
> Ik probeer een client/server applicatie te schrijven die een bestand van de client uploadt naar de server.
> Het probleem hierbij is dat ik in de code van mijn server zelf de bestandsgrootte hard gecodeerd moet meegeven.
> Hoe zou ik er voor kunnen zorgen dat de server zelf weet wat de bestandsgrootte zal zijn van het bestand dat binnenkomt?
> Mijn code ziet er als volgt uit:
>
> SERVER
> ----------
>
> class fserver {
>
> public static void main(String [] args ) throws IOException {
> int filesize=10722; // filesize temporary hardcoded
>
> // create socket
> ServerSocket servsock = new ServerSocket(1111);
> System.out.println("Waiting for connection...");
> Socket sock = servsock.accept();
> System.out.println("Accepted connection");
>
> byte [] mybytearray = new byte [filesize];
>
> BufferedInputStream bis = new BufferedInputStream(sock.getInputStream(),filesize);
> // bis.read(mybytearray,0,mybytearray.length);
>
> int bytesRead = 0;
> while ( bytesRead < filesize ) {
> int off = bytesRead;
> int len = filesize - bytesRead;
>
> int readCount = bis.read( mybytearray, off, len );
>
> if ( readCount == -1 ) { // chech for EOF
> System.err.println( "unexpected EOF" );
> System.exit( 1 );
> }
>
> bytesRead += readCount;
> }
>
> FileOutputStream fos = new FileOutputStream("C:\\briefcopy.doc");
> BufferedOutputStream bos = new BufferedOutputStream(fos);
> fos.write(mybytearray,0,mybytearray.length);
>
> // cleanup after file transfer
> sock.close();
> servsock.close();
> }
>
> }
>
>
> CLIENT
> -----------
>
> class fclient {
>
> public static void main (String [] args ) throws IOException {
>
> // create socket
> Socket sock = new Socket("127.0.0.1",1111);
> System.out.println("Connecting...");
>
> // get the file handle to send
>
> File myFile = new File( "C:\\brief.doc" );
> byte [] mybytearray = new byte [(int)myFile.length()];
> FileInputStream fis = new FileInputStream(myFile);
> BufferedInputStream bis = new BufferedInputStream(fis);
> bis.read(mybytearray,0,mybytearray.length);
> OutputStream os;
> DataOutputStream dos;
> os=sock.getOutputStream();
> dos=new DataOutputStream(os);
> System.out.println("Sending...");
> dos.write(mybytearray,0,mybytearray.length);
>
> // cleanup
>
> sock.close();
>
> }
>
> }
>
>
> -------------------------------------------------------------------
>
> Alvast bedankt,
> Pieter
>
>
>
>
Re: client/server file transfer in java
Author: b010310
Date: Tue, 23 Jan 2007 20:23
Date: Tue, 23 Jan 2007 20:23
111 lines
4576 bytes
4576 bytes
Pieter Vandewoestyne wrote:
> Hoi,
> Ik probeer een client/server applicatie te schrijven die een bestand van de
> client uploadt naar de server.
> Het probleem hierbij is dat ik in de code van mijn server zelf de
> bestandsgrootte hard gecodeerd moet meegeven.
> Hoe zou ik er voor kunnen zorgen dat de server zelf weet wat de
> bestandsgrootte zal zijn van het bestand dat binnenkomt?
> Mijn code ziet er als volgt uit:
>
> SERVER
> ----------
>
> class fserver {
>
> public static void main(String [] args ) throws IOException {
> int filesize=10722; // filesize temporary hardcoded
>
> // create socket
> ServerSocket servsock = new ServerSocket(1111);
> System.out.println("Waiting for connection...");
> Socket sock = servsock.accept();
> System.out.println("Accepted connection");
>
> byte [] mybytearray = new byte [filesize];
>
> BufferedInputStream bis = new
> BufferedInputStream(sock.getInputStream(),filesize);
> // bis.read(mybytearray,0,mybytearray.length);
>
> int bytesRead = 0;
> while ( bytesRead < filesize ) {
> int off = bytesRead;
> int len = filesize - bytesRead;
>
> int readCount = bis.read( mybytearray, off, len );
>
> if ( readCount == -1 ) { // chech for EOF
> System.err.println( "unexpected EOF" );
> System.exit( 1 );
> }
>
> bytesRead += readCount;
> }
>
> FileOutputStream fos = new FileOutputStream("C:\\briefcopy.doc");
> BufferedOutputStream bos = new BufferedOutputStream(fos);
> fos.write(mybytearray,0,mybytearray.length);
>
> // cleanup after file transfer
> sock.close();
> servsock.close();
> }
>
> }
>
>
> CLIENT
> -----------
>
> class fclient {
>
> public static void main (String [] args ) throws IOException {
>
> // create socket
> Socket sock = new Socket("127.0.0.1",1111);
> System.out.println("Connecting...");
>
> // get the file handle to send
>
> File myFile = new File( "C:\\brief.doc" );
> byte [] mybytearray = new byte [(int)myFile.length()];
> FileInputStream fis = new FileInputStream(myFile);
> BufferedInputStream bis = new BufferedInputStream(fis);
> bis.read(mybytearray,0,mybytearray.length);
> OutputStream os;
> DataOutputStream dos;
> os=sock.getOutputStream();
> dos=new DataOutputStream(os);
> System.out.println("Sending...");
> dos.write(mybytearray,0,mybytearray.length);
>
> // cleanup
>
> sock.close();
>
> }
>
> }
>
>
> -------------------------------------------------------------------
>
> Alvast bedankt,
> Pieter
>
>
>
>
Als je echt deze wijze wil gebruiken dan maak je eerst een protocol op.
Een soort van afspraak tussen client en server. De client stuurt
eerst in bv 32bytes(tekstvorm) de lengte op van het bestand, zo weet de
server zijde hoeveel hij binnen moet krijgen.
Zelf gebruik ik headers en footers rond de berichten die ik zend. Zo
weet de server perfect wanneer hij een volledige boodschap heeft.
Hoop je hiermee verder op weg te helpen....
MS: Je kan altijd FTP gebruiken........
Pascal
Re: client/server file transfer in java
Author: Pieter Vandewoestyne
Date: Mon, 29 Jan 2007 11:43
Date: Mon, 29 Jan 2007 11:43
124 lines
5012 bytes
5012 bytes
Ik heb het kunnen oplossen, maar nu zit ik met een ander probleem:
Wanneer ik meerdere files selecteer om te backuppen naar mijn server,
schrijft hij enkel de eerste file weg, daarna hangt de applicatie vast en
wordt er geen verdere code uitgevoerd.
Hieronder mijn code:
CLIENT-code
----------------
private void btnBackupActionPerformed(java.awt.event.ActionEvent evt) {
for (File f:backupfileslist) {
try{
client.sendMessage("Make Backup");
System.out.println(f);
String remoteFilename = f.getAbsolutePath();
String localFilename = f.getAbsolutePath();
InputStream socketIn = client.getLink().getInputStream();
DataOutputStream socketOut = new
DataOutputStream(client.getLink().getOutputStream());
FileInputStream fis = new FileInputStream(localFilename);
//writethe filename
socketOut.writeUTF(remoteFilename);
int bytesRead;
byte[] buffer = new byte[3000];
// write out the file
while((bytesRead = fis.read(buffer, 0, buffer.length)) >= 0)
{
socketOut.write(buffer, 0, bytesRead);
socketOut.flush();
}
fis.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ioe){
ioe.printStackTrace();
}
}
}
SERVER-code
-----------------
public void checkMessage(String sMessage) {
if (sMessage.startsWith("Make Backup")){
try{
// for reading the filename
socketIn = new
DataInputStream(clientSocket.getInputStream());
//read the filename
String filename = socketIn.readUTF();
String remotefilename = filename.substring(3);
String remotefilepath = "D:\\" + remotefilename;
System.out.println("Sending file " + remotefilepath);
// write the file
FileOutputStream fos = new FileOutputStream(remotefilepath);
int data;
int totalDataRead;
byte[] buffer = new byte[3000];
boolean isLastPacket = false;
// read file byte per byte
totalDataRead = socketIn.read(buffer, 0, buffer.length);
if(totalDataRead >= 1024){
while (totalDataRead != -1) {
// write data
fos.write(buffer,0, totalDataRead);
fos.flush();
if(!isLastPacket){
totalDataRead = socketIn.read(buffer, 0,
buffer.length);
if (totalDataRead < 1024) {
isLastPacket = true;
}
} else {
totalDataRead = -1;
isLastPacket = false;
}
}
} else {
fos.write(buffer,0, totalDataRead);
fos.flush();
}
clientSocket.close();
socketIn.close();
fos.close();
}catch(Exception ex){
System.out.println("file transfer failed");
}
System.out.println("File transfer complete");
}
}
-----------------------------------------------
Iemand die ziet wat ik hier verkeerd doe?
Groetjes,
Pieter
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads