Передача файлов через сокет между сервером Java и клиентом C # - PullRequest
0 голосов
/ 25 сентября 2018

Я создаю TCP-сервер в Java и TCP-клиент в C #.На моем Java-сервере я могу получить и сохранить файл в своей папке на сервере.Проблема в моем клиенте c #, клиент не отправляет никаких данных, поэтому сервер сохраняет файл как пустой.Есть идеи, что может быть не так?Вот код клиента c # и код сервера java:

    public void up( String nombre) throws IOException{

        /*FileOutputStream fr = new FileOutputStream(ruta+nombre);
        InputStream is = socket.getInputStream();
        byte[] buffer = new byte[8192]; // or 4096, or more
        is.read(buffer, 0, buffer.length);
        fr.write(buffer, 0, buffer.length);*/

    DataOutputStream output;
    BufferedInputStream bis;
    BufferedOutputStream bos;

    byte[] receivedData;
    int in;
    //String nombre;

    try{
        while(true){
            //Buffer de 1024 bytes
         System.out.println(nombre);
        receivedData = new byte[1024];
        bis = new BufferedInputStream(socket.getInputStream());
        DataInputStream dis=new DataInputStream(socket.getInputStream());
        //Recibimos el nombre del archivo
        //nombre = nombre.substring(nombre.indexOf('\\')+1,nombre.length());
        nombre = new File(nombre).getName();

            System.out.println(nombre);

        //Para guardar archivo recibido

        bos = new BufferedOutputStream(new FileOutputStream("C:/FTP/"+nombre));
        while ((in = bis.read(receivedData)) != -1){
            bos.write(receivedData,0,in);
        }
        bos.close();
        dis.close();
        }
    }catch (Exception e ) {
        System.err.println(e);
    }


}

Вот клиент c #

 ----------C# CLIENT---------
 public void enviarArchivo(string ruta)
    {
        try
        {
            socket = new Socket(AddressFamily.InterNetwork,          SocketType.Stream, ProtocolType.Tcp);
            socket.Connect("localhost", 5000);
            IPAddress[] address = Dns.GetHostAddresses("localhost");
            Thread thread = new Thread(leerserver);
            thread.Start();
            MessageBox.Show(ruta);
            byte[] buffer;
            buffer = ASCIIEncoding.UTF8.GetBytes(ruta);

            socket.SendFile(ruta);



        } catch (SocketException sE)
        {
            MessageBox.Show("Error al crear el socket" + sE);
        }

    }

1 Ответ

0 голосов
/ 25 сентября 2018

У меня работает следующее.Я удалил бесконечный цикл, который был у вас на стороне сервера (while(true)), и провел небольшую очистку.Ваш код в основном работает, но похоже, что у вас была куча остатков kruft от редактирования (цикл while), и вы заблудились, не читая код внимательно.

Я сделал одно небольшое изменение, чтобы использовать временный файлпотому что я не хотел создавать каталог FTP на моем компьютере.Просто измените этот один звонок на File.createTempFile на все, что вам нужно.

public class ServerTest implements Runnable {

   ServerSocket server;
   Socket socket;

   public static void main( String[] args ) throws Exception {
      new Thread( new ServerTest() ).start();
      Thread.sleep( 100 ); // wait a bit for server to start
      clientUpload();
   }

   @Override
   public void run() {
      try {
         server = new ServerSocket( 7888, 0, InetAddress.getLocalHost() );
         socket = server.accept();
         up( "ServerTest" );
      } catch( IOException ex ) {
         Logger.getLogger( ServerTest.class.getName() ).log( Level.SEVERE, null, ex );
      }

   }

   public void up( String nombre ) throws IOException {
      BufferedInputStream bis = null;
      BufferedOutputStream bos = null;

      byte[] receivedData;
      int in;
      int total = 0;
      try {
         //Buffer de 1024 bytes
         System.out.println( nombre );
         receivedData = new byte[ 1024 ];
         bis = new BufferedInputStream( socket.getInputStream() );
         //Recibimos el nombre del archivo
         //Para guardar archivo recibido
         bos = new BufferedOutputStream( new FileOutputStream( 
                 File.createTempFile( nombre, ".test" ) ) );
         while( (in = bis.read( receivedData )) != -1 ) {
            bos.write( receivedData, 0, in );
            total += in;
         }
         System.err.println( "Total bytes uploaded: " + total );
      } catch( Exception e ) {
         System.err.println( e );
      } finally {
         if( bos != null ) bos.close();
         if( bis != null ) bos.close();
      }
   }

   private static void clientUpload() {
      try( Socket client = new Socket( InetAddress.getLocalHost(), 7888 );
           OutputStream outs = client.getOutputStream() ) 
      {
         System.err.println( "Sending data..." );
         byte[] data = "This is a test!".getBytes( "UTF-8" );
         outs.write( data, 0, data.length );
         System.err.println( "Data finished." );
      } catch( IOException ex ) {
         Logger.getLogger( ServerTest.class.getName() ).log( Level.SEVERE, null, ex );
      }
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...