-
-
Save CarlEkerot/2693246 to your computer and use it in GitHub Desktop.
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(); | |
} | |
} |
You need to run server and client code on different terminals/cmd prompts.
Can compile on same terminal/prompt but, execution needs two different terminals.
both the program is running terminal
but output is not displaying
tell me what type of i/p should be given?
@iamharshit it might be because 1.png is not a directory i.e /home/(your user name)/Desktop/1.png (if it has been saved to your desktop) so it doesn't know where to look for the file
(just a guess though)
How can i save file name that is sent from Client . @CarlEkerot
@Govind071995 just store it separately and transfer it before the fine content
Pretty Nice m8
you don't need to calculate the remining (file size), just read while there is a new line.
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.
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
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.
Okay, after attempting to use this in my application I found that there are some minor bugs. It is not a good idea to ignore the return of
dos.write()
in the client because it may "duplicate" the data. It seems to be resolved in your server file, but for optimization it might be a good idea to usedos.write(byte[] b, int off, int len)
in the client.