Created
May 14, 2012 10:43
-
-
Save CarlEkerot/2693246 to your computer and use it in GitHub Desktop.
Simple java file transfer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
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
Will it make the file read faster if its done using multiple threads using FileChannel?
int read; while ((read=fis.read(buffer)) > 0) { dos.write(buffer,0,read); }
Worked for me, thank you very much!
What is the filesize in serverside bro ? why did you set it equal 15123 ?
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
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