how to implement TCP server and TCP client in java to transfer files
Asked Answered
E

3

11

I have implement the simple TCP server and TCP client classes which can send the message from client to server and the message will be converted to upper case on the server side, but how can I achieve transfer files from server to client and upload files from client to server. the following codes are what I have got.

TCPClient.java:

import java.io.*;
import java.net.*;

class TCPClient {
 public static void main(String args[]) throws Exception {
        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        Socket clientSocket = new Socket("127.0.0.1", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + "\n");
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER:" + modifiedSentence);
        clientSocket.close();
    }
}

TCPServer.java:

import java.io.*;
import java.net.*;

class TCPServer {
    public static void main(String args[]) throws Exception {
        int firsttime = 1;
        while (true) {
            String clientSentence;
            String capitalizedSentence="";
            ServerSocket welcomeSocket = new ServerSocket(3248);
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            //System.out.println(clientSentence);
            if (clientSentence.equals("set")) {
                outToClient.writeBytes("connection is ");
                System.out.println("running here");
                //welcomeSocket.close();
                //outToClient.writeBytes(capitalizedSentence);
            }
            capitalizedSentence = clientSentence.toUpperCase() + "\n";
            //if(!clientSentence.equals("quit"))
            outToClient.writeBytes(capitalizedSentence+"enter the message or command: ");
            System.out.println("passed");
            //outToClient.writeBytes("enter the message or command: ");
            welcomeSocket.close();
            System.out.println("connection terminated");
        }
    }
}

So, the TCPServer.java will be executed first, and then execute the TCPClient.java, and I try to use the if clause in the TCPServer.java to test what is user's input,now I really want to implement how to transfer files from both side(download and upload).Thanks.

Elam answered 12/1, 2011 at 7:9 Comment(2)
#4688115Kristykristyn
Additionally to all answers, you may read all the bytes of any file at once with readAllBytes(...) and write them to any file with write(...).Butterfly
I
4

So lets assume on server side you have received the file name and file path. This code should give you some idea.

SERVER

PrintStream out = new PrintStream(socket.getOutputStream(), true);
FileInputStream requestedfile = new FileInputStream(completeFilePath);
byte[] buffer = new byte[1];
out.println("Content-Length: "+new File(completeFilePath).length()); // for the client to receive file
while((requestedfile.read(buffer)!=-1)){
    out.write(buffer);
    out.flush();    
    out.close();    
}
requestedfile.close();

CLIENT

DataInputStream in = new DataInputStream(socket.getInputStream());
int size = Integer.parseInt(in.readLine().split(": ")[1]);
byte[] item = new byte[size];
for(int i = 0; i < size; i++)
    item[i] = in.readByte();
FileOutputStream requestedfile = new FileOutputStream(new File(fileName));
BufferedOutputStream bos = new BufferedOutputStream(requestedfile);
bos.write(item);
bos.close();
fos.close();
Ivetteivetts answered 23/10, 2013 at 8:18 Comment(0)
S
1

Assuming you want to continue to support sending messages as well as sending files back and forth...

As you have now, you are using writeBytes to send data from client to server.

You can use that to send anything, like the contents of files...

But you will need to define a protocol between your client and server so that they know when a file is being transferred rather than a chat message.

For example you could send the message/string "FILECOMING" before sending a file to the server and it would then know to expecting the bytes for a file. Similarly you'd need a way to mark the end of a file too...

Alternatively, you could send a message type before each message.

A more performant/responsive solution is to do the file transfer on a separate thread/socket - this means that the chat messages are not held up by the transfers. Whenever a file transfer is required, a new thread/socket connection is created just for that.

~chris

Sadism answered 12/1, 2011 at 7:16 Comment(1)
Ideally you'd need some to use separate Sockets to handle commands. The way it's done with FTP is that there's a command channel and a data channel.Kristykristyn
G
0
import java.io.*;
import java.net.*;

class TCPClient
{
    public static void main(String argv[]) throws IOException
    {
      String sentence;
      String modifiedSentence;
      Socket clientSocket = new Socket("*localhost*", *portnum*); // new Socket("192.168.1.100", 80);
      System.out.println("Enter your ASCII code here");
      BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
      sentence = inFromUser.readLine();
//    System.out.println(sentence);

          while(!(sentence.isEmpty()))
          {          
              DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
              outToServer.writeBytes(sentence);

              BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
              modifiedSentence = inFromServer.readLine();

                  while(!(modifiedSentence.isEmpty()))
                  {                   
                      System.out.println("FROM SERVER: " + modifiedSentence);
                      break;
                  }

              System.out.println("Enter your ASCII code here");
              inFromUser = new BufferedReader( new InputStreamReader(System.in));
              sentence = inFromUser.readLine();
          }

      System.out.println("socket connection going to be close");    
      clientSocket.close();
    }

}
Good answered 30/8, 2016 at 7:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.