2011-01-12 6 views
10

Ho implementato il semplice server TCP e le classi client TCP che possono inviare il messaggio dal client al server e il messaggio verrà convertito in maiuscolo sul lato server, ma come posso trasferire file da server a client e caricare file da client a server. i seguenti codici sono ciò che ho ottenuto.come implementare il server TCP e il client TCP in java per trasferire file

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

Quindi, verrà eseguito il TCPServer.java prima, e poi eseguire il TCPClient.java, e cerco di utilizzare la clausola if nella TCPServer.java per testare cosa è l'input dell'utente, ora voglio davvero implementare come trasferire file da entrambi i lati (download e upload) .Grazie.

+0

http://stackoverflow.com/questions/4687615/how-to-achieve-transfer-file-between-client-and- server-using-java-socket –

+0

Oltre a tutte le risposte, è possibile leggere tutti i byte di tutti i file contemporaneamente con [readAllBytes (...)] (http://docs.oracle.com/javase/8/docs/ api/java/nio/file/Files.html # readAllBytes-java.nio.file.Path-) e scriverli su qualsiasi file w con [scrivi (...)] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#write-java.nio.file.Path-byte: A-java.nio.file.OpenOption ...-). – thanopi57

risposta

2

This collegamento dovrebbe essere di aiuto.

+0

Ho aggiunto se (clientSentence.uguale a ("buono")) \t {capitalizedSentence = "connection is set"; \t //outToClient.writeBytes(capitalizedSentence); \t} \t altro \t \t \t {capitalizedSentence = clientSentence.toUpperCase() + "\ n"; \t \t \t \t \t \t} outToClient.writeBytes (capitalizedSentence); welcomeSocket.close(); al codice del server, ma sembra che non funzioni, puoi aiutarmi con esso? – starcaller

+0

Dovrai dirci quale codice stai usando e quale eccezione stai ricevendo. – npinti

+0

Ho aggiornato la domanda, per favore controlla, grazie. – starcaller

1

Supponendo che si desidera continuare a sostenere l'invio di messaggi, così come l'invio di file avanti e indietro ...

Come avete ora, si sta utilizzando writeBytes per inviare i dati dal client al server.

È possibile utilizzare che per inviare qualsiasi cosa, come il contenuto dei file ...

Ma è necessario definire un protocollo tra il client e il server in modo che sappiano quando un file viene trasferito piuttosto che un messaggio di chat.

Ad esempio, è possibile inviare il messaggio/stringa "FILECOMING" prima di inviare un file al server e sarebbe quindi in grado di prevedere i byte per un file. Allo stesso modo avresti bisogno di un modo per contrassegnare anche la fine di un file ...

In alternativa, è possibile inviare un tipo di messaggio prima di ogni messaggio.

Una soluzione più performante/reattiva consiste nel trasferire il file su un thread/socket separato, ovvero i messaggi di chat non vengono trattenuti dai trasferimenti. Ogni volta che è richiesto un trasferimento di file, viene creata una nuova connessione thread/socket solo per quello.

~ chris

+0

potete darmi alcuni esempi di codice per studiare per favore, thx. – starcaller

+0

Idealmente avresti bisogno di un po 'di usare Socket separati per gestire i comandi. Il modo in cui è fatto con FTP è che c'è un canale di comando e un canale dati. –

4

Quindi, consente di assumere sul lato server si è ricevuto il nome del file e il percorso del file. Questo codice dovrebbe darti un'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(); 

CLIENTE

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

}