it-swarm.com.de

wie zu implementieren TCP Server und TCP Client in Java zur Übertragung von Dateien

Ich habe die einfachen TCP Server- und TCP Clientklassen implementiert, die die Nachricht vom Client an den Server senden können, und die Nachricht wird auf der Serverseite in Großbuchstaben konvertiert. Wie kann ich das tun? Übertragen von Dateien von Server zu Client und Hochladen von Dateien von Client zu Server. Ich habe die folgenden Codes.

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

Der TCPServer.Java wird also zuerst ausgeführt und dann der TCPClient.Java ausgeführt, und ich versuche, die if-Klausel in TCPServer.Java zu verwenden, um die Eingaben des Benutzers zu testen. Jetzt möchte ich wirklich implementieren, wie Dateien von beiden Seiten übertragen werden (Herunterladen und Hochladen) ).Vielen Dank.

11
starcaller

Nehmen wir also an, auf der Serverseite haben Sie den Dateinamen und den Dateipfad erhalten. Dieser Code sollte Ihnen eine Idee geben.

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();

KLIENT

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

Angenommen, Sie möchten weiterhin das Senden von Nachrichten sowie das Senden von Dateien unterstützen.

Sie verwenden jetzt writeBytes, um Daten vom Client an den Server zu senden.

Sie können damit etwas senden, wie den Inhalt von Dateien ...

Sie müssen jedoch ein Protokoll zwischen Client und Server definieren, damit diese wissen, wann eine Datei übertragen wird, und nicht eine Chat-Nachricht.

Sie können zum Beispiel die Nachricht/Zeichenfolge "FILECOMING" senden, bevor Sie eine Datei an den Server senden, und dann würde es die Bytes für eine Datei erwarten. Genauso brauchst du eine Möglichkeit, das Ende einer Datei zu markieren ... 

Alternativ können Sie vor jeder Nachricht einen Nachrichtentyp senden. 

Eine performantere/reaktionsfähigere Lösung besteht darin, die Dateiübertragung auf einem separaten Thread/Socket durchzuführen. Dies bedeutet, dass die Chatnachrichten nicht durch die Übertragungen aufgehalten werden. Immer wenn eine Dateiübertragung erforderlich ist, wird eine neue Thread/Socket-Verbindung erstellt.

~ 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