2011-01-12 13 views
10

Mam zaimplementować proste klasy klienta TCP i serwera TCP, które mogą wysłać wiadomość od klienta do serwera, a wiadomość zostanie przekonwertowana na duże litery po stronie serwera, ale w jaki sposób mogę uzyskać transfer plików z serwera do klienta i przesłać pliki z klienta na serwer. następujące kody są tym, co mam.jak zaimplementować serwer TCP i klienta TCP w java do transferu plików

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

Tak, TCPServer.java zostanie wykonany pierwszy, a następnie wykonać TCPClient.java, i staram się użyć, jeśli klauzula w TCPServer.java przetestować co jest wkładem użytkownika, teraz naprawdę chcę zaimplementować sposób przesyłania plików z obu stron (pobieranie i przesyłanie). Dzięki.

+0

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

+0

Oprócz wszystkich odpowiedzi, możesz przeczytać wszystkie bajty dowolnego pliku naraz za pomocą [readAllBytes (...)] (http://docs.oracle.com/javase/8/docs/ api/java/nio/file/Files.html # readAllBytes-java.nio.file.Path-) i zapisz je do dowolnego pliku w z [write (...)] (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

Odpowiedz

2

This link powinien być pomoc.

+0

Dodałem, jeśli (clientSentence.equals ("good")) \t {capitalizedSentence = "ustawiono połączenie"; \t //outToClient.writeBytes(capitalizedSentence); \t} \t inny \t \t \t {capitalizedSentence = clientSentence.toUpperCase() + "\ n"; \t \t \t \t \t \t} outToClient.writeBytes (capitalizedSentence); welcomeSocket.close(); do kodu serwera, ale wygląda na to, że nie działa, czy możesz mi pomóc z tym proszę? – starcaller

+0

Będziesz musiał powiedzieć nam, jakiego kodu używasz i jaki wyjątek otrzymujesz. – npinti

+0

Mam zaktualizowane pytanie, sprawdź to, dzięki. – starcaller

1

Zakładając, że chcemy nadal wspierać wysyłania wiadomości, jak również wysyłania plików iz powrotem ...

Jak już teraz używasz writeBytes do wysyłania danych od klienta do serwera.

można używać, aby wysłać coś, jak zawartość plików ...

Ale trzeba będzie zdefiniować protokół między klientem a serwerem, dzięki czemu wiedzą, kiedy plik zostanie przeniesiony, a nie wiadomość na czacie.

Na przykład możesz wysłać wiadomość/ciąg "FILECOMING" przed wysłaniem pliku na serwer i wtedy będzie wiedział, że spodziewa się bajtów dla pliku. Podobnie potrzebujesz sposobu na oznaczenie końca pliku ...

Możesz również wysłać wiadomość przed każdą wiadomością.

Bardziej wydajnym/responsywnym rozwiązaniem jest przesyłanie plików w oddzielnym wątku/gnieździe - oznacza to, że wiadomości nie są wstrzymywane przez transfery. Ilekroć wymagany jest transfer plików, tworzone jest właśnie nowe połączenie wątku/gniazda.

~ chris

+0

czy możesz dać mi kilka próbek kodu do nauki, thx. – starcaller

+0

Najlepiej byłoby, gdybyś użył oddzielnych gniazd do obsługi poleceń. Sposób, w jaki robi się to za pomocą FTP, jest taki, że istnieje kanał poleceń i kanał danych. –

4

Więc pozwala zakładać po stronie serwera masz otrzymał nazwę pliku i ścieżkę do pliku. Ten kod powinien dać ci pewien pomysł.

SERWER

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

}