web-dev-qa-db-fra.com

comment mettre en œuvre TCP serveur et TCP client en Java pour transférer des fichiers

J'ai implémenté les classes simples TCP serveur et TCP qui peuvent envoyer le message de client à serveur et le message sera converti en majuscule côté serveur, mais comment puis-je transférer des fichiers depuis serveur à client et télécharger des fichiers de client à serveur. Les codes suivants sont ce que j'ai.

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");
        }
    }
}

Donc, le TCPServer.Java sera d'abord exécuté, puis exécutez le TCPClient.Java et j'essaie d'utiliser la clause if dans le TCPServer.Java pour tester les entrées de l'utilisateur. Maintenant, je veux vraiment implémenter comment transférer des fichiers des deux côtés ).Merci.

11
starcaller

Supposons donc que côté serveur, vous avez reçu le nom et le chemin du fichier. Ce code devrait vous donner une idée.

SERVEUR

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();
4
Vikrant Goel

En supposant que vous souhaitiez continuer à prendre en charge l'envoi de messages ainsi que l'envoi de fichiers dans les deux sens ...

Comme vous l'avez maintenant, vous utilisez writeBytes pour envoyer des données d'un client à un serveur.

Vous pouvez l'utiliser pour tout envoyer, comme le contenu des fichiers ...

Mais vous devrez définir un protocole entre votre client et votre serveur afin qu’ils sachent quand un fichier est en cours de transfert plutôt qu’un message de discussion.

Par exemple, vous pouvez envoyer le message/chaîne "FILECOMING" avant d'envoyer un fichier au serveur et le système attend ensuite l'attente des octets d'un fichier. De même, vous auriez également besoin d'un moyen de marquer la fin d'un fichier ... 

Vous pouvez également envoyer un type de message avant chaque message. 

Une solution plus performante/sensible consiste à effectuer le transfert de fichier sur un thread/socket distinct - cela signifie que les messages de discussion ne sont pas bloqués par les transferts. Chaque fois qu'un transfert de fichier est requis, une nouvelle connexion thread/socket est créée uniquement pour cela.

~ chris

1
Chris Kimpton
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();
    }

}
0
Thangarasu