File Transfer Example Using Socket
This code snippet demonstrates a very simple file transfer program. In this example the client program sends a file to the server. The client program is a GUI and allows a user to browse for a file to send to the server.
// Client.java
/*
* In this client/server example, the client sends a file to the server.
*
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class Client
extends JFrame implements ActionListener {
private JTextField txtFile
;
public static void main
(String args
[]){
/* Create and display the client form */
Client clientForm
= new Client
();
clientForm.
Display();
}
public void Display
(){
JFrame frame
= new JFrame();
frame.
setTitle("Client");
FlowLayout layout
= new FlowLayout();
layout.
setAlignment(FlowLayout.
LEFT);
JLabel lblFile
= new JLabel("Filename:");
txtFile
= new JTextField();
txtFile.
setPreferredSize(new Dimension(150,
30));
JButton btnTransfer
= new JButton("Transfer");
btnTransfer.
addActionListener(this);
JPanel mainPanel
= new JPanel();
mainPanel.
setLayout(layout
);
mainPanel.
add(lblFile
);
mainPanel.
add(txtFile
);
mainPanel.
add(btnTransfer
);
frame.
getContentPane().
add(mainPanel
);
frame.
pack();
frame.
setVisible(true);
}
public void actionPerformed
(ActionEvent e
) {
/* File Open Dialog box allows the user to select a file */
JFileChooser fileDlg
= new JFileChooser();
fileDlg.
showOpenDialog(this);
String filename
= fileDlg.
getSelectedFile().
getAbsolutePath();
txtFile.
setText(filename
);
try{
/* Try to connect to the server on localhost, port 5555 */
Socket sk
= new Socket("localhost",
5555);
OutputStream output
= sk.
getOutputStream();
/* Send filename to server */
OutputStreamWriter outputStream
= new OutputStreamWriter(sk.
getOutputStream());
outputStream.
write(fileDlg.
getSelectedFile().
getName() + "\n");
outputStream.
flush();
/* Get reponse from server */
BufferedReader inReader
= new BufferedReader(new InputStreamReader(sk.
getInputStream()));
String serverStatus
= inReader.
readLine(); // Read the first line
/* If server is ready, send the file */
if ( serverStatus.
equals("READY") ){
FileInputStream file
= new FileInputStream(filename
);
byte[] buffer
= new byte[sk.
getSendBufferSize()];
int bytesRead
= 0;
while((bytesRead
= file.
read(buffer
))>0)
{
output.
write(buffer,
0,bytesRead
);
}
output.
close();
file.
close();
sk.
close();
JOptionPane.
showMessageDialog(this,
"Transfer complete");
}
}
catch (Exception ex
){
/* Catch any errors */
JOptionPane.
showMessageDialog(this, ex.
getMessage());
}
}
}
// Server.java
/*
* Server waits for a connection to be established by client
*
*/
import java.io.*;
import java.net.*;
class Server
{
public static void main
(String args
[])throws Exception
{
System.
out.
println("Server running...");
/* Listen on port 5555 */
ServerSocket server
= new ServerSocket(5555);
/* Accept the sk */
Socket sk
= server.
accept();
System.
out.
println("Server accepted client");
InputStream input
= sk.
getInputStream();
BufferedReader inReader
= new BufferedReader(new InputStreamReader(sk.
getInputStream()));
BufferedWriter outReader
= new BufferedWriter(new OutputStreamWriter(sk.
getOutputStream()));
/* Read the filename */
String filename
= inReader.
readLine();
if ( !filename.
equals("") ){
/* Reply back to client with READY status */
outReader.
write("READY\n");
outReader.
flush();
}
/* Create a new file in the tmp directory using the filename */
FileOutputStream wr
= new FileOutputStream(new File("C://tmp/" + filename
));
byte[] buffer
= new byte[sk.
getReceiveBufferSize()];
int bytesReceived
= 0;
while((bytesReceived
= input.
read(buffer
))>0)
{
/* Write to the file */
wr.
write(buffer,
0,bytesReceived
);
}
}
}