Skip to content

Instantly share code, notes, and snippets.

@CarlEkerot
Created May 14, 2012 10:43
Show Gist options
  • Save CarlEkerot/2693246 to your computer and use it in GitHub Desktop.
Save CarlEkerot/2693246 to your computer and use it in GitHub Desktop.
Simple java file transfer
package client;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
public class FileClient {
private Socket s;
public FileClient(String host, int port, String file) {
try {
s = new Socket(host, port);
sendFile(file);
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendFile(String file) throws IOException {
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[4096];
while (fis.read(buffer) > 0) {
dos.write(buffer);
}
fis.close();
dos.close();
}
public static void main(String[] args) {
FileClient fc = new FileClient("localhost", 1988, "cat.jpg");
}
}
package server;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer extends Thread {
private ServerSocket ss;
public FileServer(int port) {
try {
ss = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while (true) {
try {
Socket clientSock = ss.accept();
saveFile(clientSock);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void saveFile(Socket clientSock) throws IOException {
DataInputStream dis = new DataInputStream(clientSock.getInputStream());
FileOutputStream fos = new FileOutputStream("testfile.jpg");
byte[] buffer = new byte[4096];
int filesize = 15123; // Send file size in separate msg
int read = 0;
int totalRead = 0;
int remaining = filesize;
while((read = dis.read(buffer, 0, Math.min(buffer.length, remaining))) > 0) {
totalRead += read;
remaining -= read;
System.out.println("read " + totalRead + " bytes.");
fos.write(buffer, 0, read);
}
fos.close();
dis.close();
}
public static void main(String[] args) {
FileServer fs = new FileServer(1988);
fs.start();
}
}
@kmursi
Copy link

kmursi commented Mar 7, 2017

you don't need to calculate the remining (file size), just read while there is a new line.

@swagatsy
Copy link

swagatsy commented Jun 5, 2017

error
I get this error. Any suggestions???

@Perzios
Copy link

Perzios commented Mar 17, 2018

How would i modify this to allow for more than one client to be connected to the server and when a client sends a file, the server sends it to the other users.

@canyuns
Copy link

canyuns commented May 11, 2018

when I transfer a small file, it work fine.
however, when I transfer a big file, client throws:
java.net.SocketException: Broken pipe

why? hope have a answer, thanks

@SalkinD
Copy link

SalkinD commented Aug 18, 2018

change

while (fis.read(buffer) > 0) {
    dos.write(buffer);
}

to

int read;
while ((read=fis.read(buffer)) > 0) {
	dos.write(buffer,0,read);
}

-> now it works

@flashsloth
Copy link

Will it make the file read faster if its done using multiple threads using FileChannel?

@Sxubas
Copy link

Sxubas commented Sep 19, 2018

int read;
while ((read=fis.read(buffer)) > 0) {
	dos.write(buffer,0,read);
}

Worked for me, thank you very much!

@hoangthan
Copy link

What is the filesize in serverside bro ? why did you set it equal 15123 ?

@ThanhSon232
Copy link

You guys need to set the size for the buffer as the same as your file, also fileSize, the best solution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment