Как реализовать TCP-сервер и TCP-клиент в Java для передачи файлов - PullRequest
11 голосов
/ 12 января 2011

Я реализовал простые классы TCP-сервера и TCP-клиента, которые могут отправлять сообщение от клиента к серверу, и сообщение будет преобразовано в верхний регистр на стороне сервера, но как я могу добиться передачи файлов с сервера на клиент и загрузкифайлы от клиента к серверу.я получил следующие коды:

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

Итак, TCPServer.java будет выполненсначала, а затем выполнить TCPClient.java, и я пытаюсь использовать условие if в TCPServer.java, чтобы проверить, что вводит пользователь, теперь я действительно хочу реализовать способ передачи файлов с обеих сторон (загрузка и выгрузка). Спасибо.

Ответы [ 3 ]

4 голосов
/ 23 октября 2013

Итак, давайте предположим, что на стороне сервера вы получили имя файла и путь к файлу.Этот код должен дать вам некоторое представление.

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();
1 голос
/ 12 января 2011

Предполагая, что вы хотите продолжить поддерживать отправку сообщений, а также отправку файлов туда и обратно ...

Как и сейчас, вы используете writeBytes для отправки данных с клиента на сервер.

Вы можете использовать это для отправки чего угодно, например содержимого файлов ...

Но вам нужно будет определить протокол между вашим клиентом и сервером, чтобы они знали, когда передается файл, а не сообщение чата.

Например, вы можете отправить сообщение / строку « FILECOMING » перед отправкой файла на сервер, и тогда он узнает, ожидая байтов для файла. Точно так же вам нужен способ пометить конец файла тоже ...

Кроме того, вы можете отправить тип сообщения перед каждым сообщением.

Более производительным / отзывчивым решением является передача файлов в отдельном потоке / сокете - это означает, что сообщения чата не задерживаются при передаче. Всякий раз, когда требуется передача файла, для этого создается новое соединение потоков / сокетов.

~ * Крис 1017 *

0 голосов
/ 30 августа 2016
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();
    }

}
...