Java: перенести файл на сервер и получить файл с сервера в верхнем регистре - PullRequest
0 голосов
/ 18 мая 2018

Я хочу отправить файл .txt с клиента на сервер и вернуть его в верхнем регистре.Но этот код ничего не делает. Кто-нибудь может сказать, что здесь не так ..?

СЕРВЕР: получение файла от клиента и отправка его обратно в верхнем регистре клиенту.

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;

public class Assignment4_Server {

    public static void main(String[] args) throws IOException {
        byte[] bytearray = new byte[4096];
        try (ServerSocket ss = new ServerSocket(4444)) {
            Socket s = ss.accept();
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            int count;
            String data = null ;
            while((count = is.read(bytearray))>0){
                data = Arrays.toString(bytearray).toUpperCase();
                byte[] bytearrayout = data.getBytes();
                os.write(bytearrayout);
            }
            s.close();
        }
    }
}

КЛИЕНТ:отправка файла text.txt на сервер и получение файла обратно после преобразования в верхний регистр.

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


public class Assignment4_client {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        byte[] bytearray = new byte[4096];
        Socket sc = new Socket("localhost",4444);
        //send file
        int countS , countR;
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        OutputStream os = sc.getOutputStream();
        while((countS = bis.read(bytearray))>0){
        os.write(bytearray);
        }
        //recieve file in uppercase from server
        InputStream is = sc.getInputStream();
        byte[] bytearray2 = new byte[4096];
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        while((countR = is.read(bytearray2))>0){
            bos.write(bytearray2);
        }
    }   
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Что здесь не так, так это две простые вещи.

  1. Сервер читает до конца потока в сокете, который должен использоваться для ответа.Поэтому клиент не может закрыть его после отправки запроса на предоставление EOS, поэтому он должен отключить сокет для вывода после отправки запроса.

  2. Ваши циклы копирования неверны.Общая форма:

    while ((count = in.read(buffer)) > 0)
    {
         out.write(buffer, 0, count);
    }
    

    Вы игнорируете счетчик чтения при записи, поэтому вы будете писать ненужные в конце потока или в любое другое время, когда read() не заполнит buffer, чтоможет быть в любое время.

0 голосов
/ 21 мая 2018

Вот код, который должен вам помочь.Но прежде чем читать его, вы должны знать, что происходит:

  1. Ваш клиент не отправляет на сервер информацию о прекращении чтения (прочитайте код клиента ниже).Вот почему сервер застревает в цикле while, когда пытается прочитать данные, отправленные клиентом.Вероятно, поэтому вы попытались отправить данные обратно клиенту.Отключите выход сокета со стороны клиента, чтобы соблюдать контракт Socket, и правильно освободите сокет (см. TCP / IP).
  2. Данное решение не учитывает, что сервер должен оставаться в рабочем состоянии после того, как он выполнит свой долг.Тогда сервер не сможет обслуживать более одного клиента одновременно.Этот сервер предлагает единовременное обслуживание, которое бессмысленно.Чтобы преодолеть эту проблему, вы должны поместить все в цикл while и связать каждый новый серверный процесс в новый поток (я позволю вам сделать это, это очень приятно).
  3. Сервер не учитывает весь размер данных, и он может столкнуться с ошибкой нехватки памяти, если данные слишком тяжелые.Вы должны найти способ избежать этой проблемы в реальной реализации.
  4. Обе программы должны перехватить исключение и зарегистрировать его где-нибудь, чтобы вы могли быть в курсе любых ошибок.
  5. Написание сервера не так просто.Обычно вы должны написать какой-то протокол с заголовками и тому подобным.Чтобы избежать этого, используйте такие объекты, как ObjectOutputStream и ObjectInputStream, но у него есть некоторые ограничения, такие как ограничение вашего сервера в мире Java.

КЛИЕНТ

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

public class Client {


    public void send(File file)
    {
        Socket sc = null;
        try
        {
            byte[] bytearray = new byte[4096];
            sc = new Socket("localhost", 4444);

            // 1. Read the file, send its content, close it. 
            int count;
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            OutputStream os = sc.getOutputStream();

            while((count = bis.read(bytearray))>0)
            {
                os.write(bytearray);
            }
            fis.close();
            sc.shutdownOutput();

            // 2. Delete old file, receive data, write it to new File.
            InputStream is = sc.getInputStream();
            bytearray = new byte[4096];
            // Eventually do what you want with the file: new one, append, etc.
            file.delete();
            file.createNewFile();
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
            count = 0;
            while((count = is.read(bytearray)) > 0)
            {
                bos.write(bytearray, 0, count);
            }
            fos.close();
            bos.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (sc != null)
            {
                try
                {
                    sc.close();
                } catch (IOException e) {}
            }
        }
    }
}

СЕРВЕР

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{
    Server()
    {
        Socket s = null;
        byte[] bytearray = new byte[4096];
        try (ServerSocket ss = new ServerSocket(4444))
        {
            s = ss.accept();
            InputStream is = s.getInputStream();

            // 1. Recieve data and put it to UpperCase.
            String data = "";
            int count;
            while((count = is.read(bytearray)) > 0)
            {
                data += new String(bytearray, 0, count);
            }
            data = data.toUpperCase();
            System.out.println(data);

            // 2. Send back data.
            OutputStream os = s.getOutputStream();
            os.write(data.getBytes());
            os.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

ИСПЫТАТЕЛЬНАЯ ПРОГРАММА

Это должно помочь вам протестировать обе ваши программы в одном и том же проекте в IDE.

import java.io.File;

public class Test
{
    public static void main(String[] args)
    {
        Client c = new Client();
        (new Thread()
        {
            public void run()
            {
                Server s = new Server();
            }
        }).start();
        c.send(new File("test.txt"));
    }
}
...