2017-06-10 2 views
1

Ich habe versucht, einen Messenger mit Dateiübertragungsfunktionen zu erstellen, aber ich habe am Ende zu viele Null-Zeichen. Jedes Mal, wenn ich die Dateilänge benutze, um sie zu entfernen, wird aus irgendeinem Grund mehr von der Datei entfernt und es wird einfach zu einem totalen Durcheinander. Ich verwende keine Java 7 oder höhere Elemente, da ich es mit Java 6 und Windows 98 (Omas PC) kompatibel machen möchte.Java-Dateiübertragung über Sockets trim letzte Bytes

Ich habe auch eine Menge von zufälligen Null-Zeichen erhalten in die Datei, im nicht sicher, wie dieses Dies ist mein Code

zu vermeiden:

package com.androdome.lunacoffee.management; 

import java.io.DataOutputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import com.androdome.lunacoffee.ErrorScreen; 
import com.androdome.lunacoffee.SendScreen; 

public class FileTransmitter implements Runnable{ 
    String adds; 
    FileInputStream message; 
    int filecut = 4096; 
    byte[] fileName; 
    long fileSize; 
    SendScreen send; 
    public FileTransmitter(String address, FileInputStream msg, byte[] fnme, SendScreen snd, long l) { 
      adds = address; 
      send = snd; 
      message = msg; 
      fileName = fnme; 
      fileSize = l; 
    } 




    public void run() 
    { 
     try { 
      InetAddress add = InetAddress.getByName(adds); 
      Socket sock = new Socket(add, 11001); 
      DataOutputStream da = new DataOutputStream(sock.getOutputStream()); 
      PrintWriter output = new PrintWriter(da); 
      da.write(fileName); 


      da.writeLong(message.getChannel().size()); 

      byte[] filebuffer = new byte[filecut]; 
      int g = 0; 
      int back = 0; 
      while((g = message.read(filebuffer)) != -1) 
      { 
       if(g != filecut && g > 0) 
       { 
        back = g; 
       } 
       da.write(filebuffer); 
       filebuffer = new byte[filecut]; 
      } 
      da.writeInt(back); 
      System.out.print(back); 

      output.flush(); 
      output.close(); 
      send.incrementSent(); 
     } catch (UnknownHostException e) { 
      send.incrementError(); 
      // TODO Auto-generated catch block 
      StringWriter sw = new StringWriter(); 
      PrintWriter pw = new PrintWriter(sw); 
      e.printStackTrace(pw); 
      new ErrorScreen("Unable to send file", "Your file was not able to send because the host \"" + adds + "\" was not availible!", sw.toString()); 
      pw.close(); 
      try { 
       sw.close(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

     } catch (IOException e) { 
      send.incrementError(); 
      // TODO Auto-generated catch block 
      new ErrorScreen("Unable to send file", "Your file was not able to send due to a bad output stream!", e.getMessage()); 
     } 
    } 

} 

Recieve Senden:

package com.androdome.lunacoffee.management; 

import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Arrays; 

import com.androdome.lunacoffee.ErrorScreen; 
import com.androdome.lunacoffee.FileScreen; 
import com.androdome.lunacoffee.Main; 

public class FileReciever implements Runnable { 
    int bufferSize = 4096; 
    int headerSize = 32; 
    byte[] filebuffer = new byte[bufferSize]; 
    byte[] fileheader = new byte[headerSize]; 
    Main main; 
    File downloadfile = new File("tmp"); 
    File transferFile = new File("dnl.ldf"); 
    public FileReciever(Main mn) 
    { 
     main = mn; 
    } 


    static byte[] trim(byte[] bytes) 
    { 
     int i = bytes.length - 1; 
     while (i >= 0 && bytes[i] == 0) 
     { 
      --i; 
     } 

     return Arrays.copyOf(bytes, i + 1); 
    } 

    public void run() { 


     try { 
      ServerSocket recieveSocket = new ServerSocket(11001); 
      while (this != null) { 
       try{ 
       downloadfile.createNewFile(); 
       Socket connectionSocket = recieveSocket.accept(); 
       DataInputStream reader = new DataInputStream(connectionSocket.getInputStream()); 
       reader.read(fileheader); 
       long fileSize = reader.readLong(); 
       System.out.println(bufferSize); 
       filebuffer = new byte[bufferSize]; 

       String fileName = new String(fileheader); 
       fileheader = new byte[headerSize]; 
       FileOutputStream fw = new FileOutputStream(downloadfile); 
       while(reader.read(filebuffer) != -1) 
        { 
         fw.write(filebuffer); 
         filebuffer = new byte[bufferSize]; 
        }   
       //reader.readInt(); 
       reader.close(); 
       fw.close(); 
       //RandomAccessFile file = new RandomAccessFile(downloadfile, "Rwd"); 
       //file.setLength(fileSize); // Strip off the last _byte_, not the last character 
       //file.close(); 

       connectionSocket.close(); 
       FileScreen fs = new FileScreen(downloadfile, fileName, connectionSocket.getInetAddress().getHostName()); 
       fs.setVisible(true); 
       fs.setLocationRelativeTo(null); 
       } 
       catch(Exception ex) 
       {} 
      } 
     } catch (IOException e) { 
      StringWriter sw = new StringWriter(); 
      PrintWriter pw = new PrintWriter(sw); 
      e.printStackTrace(pw); 
      new ErrorScreen("Unable to start the File Recieve Thread", "Luna Messenger may already be running, or another program is using port 11001. Please close any program running on port 11001.", sw.toString()); 
      pw.close(); 
      try { 
       sw.close(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    } 

} 
+0

g ist die Anzahl der Bytes, die gelesen wurden und die Sie daher schreiben müssen. Aber Sie schreiben stattdessen den ganzen Puffer. Und Sie erstellen einen neuen Puffer, der nutzlos ist –

+0

einige dieser Dinge sind Reste – Hello234

+0

Der Code scheint fast zufällig. –

Antwort

0

In Ihrem obigen Code, ich denke, es macht folgenden Fehler. Die erste, sollten Sie eine Nummer hinzufügen, die den Dateinamen des length.like zeigen dies:

da.writeInt(fileName.length); //the added code 
da.write(fileName); 

Auf der FileReciever, der Empfangscode lautet:

int fileNameLength = reader.readInt(); 
fileheader=new byte[fileNameLength]; 
read(reader,fileheader,0,fileNameLength); 

die read Methode Länge Bytes lesen kann vom Eingangsstrom in ein Array von Bytes, bis der Strom endet.

public static int read(InputStream in, byte[] b, int off, int len) throws IOException { 
    if (len < 0) { 
     throw new IndexOutOfBoundsException("len is negative"); 
    } 
    int total = 0; 
    while (total < len) { 
     int result = in.read(b, off + total, len - total); 
     if (result == -1) { 
      break; 
     } 
     total += result; 
    } 
    return total; 
} 

Die zweite ist es nicht richtig, dass die FileTransmitter das Dateidatum auf die FileReciever übersetzen, und sollte nicht eine Reihe an Endes geeigneten Ansatz hinzufügen wird nur Dateidaten zu schreiben in FileTransmitter an Buchse Output und don ‚tut t andere things.Like diesem:

while((g = message.read(filebuffer)) != -1) 
{ 
    da.write(filebuffer,0,g); 
} 

auf der orther Hand, und wie viele Bytes sollte abhängig von der Länge des Bytes readed werden, die Ihr aus der Steckdose des Input vor mir gelesen, wenn Sie die gelesenen Bytes aus Steckdose oupustream in filebuffer. der Empfängercode:

int readLength; 
int sumLength=0; 
while((readLength=reader.read(filebuffer,0,(int)(fileSize-sumLength>filebuffer.length?filebuffer.length:fileSize-sumLength))) != -1){ 
     sumLength+=readLength; 
     fw.write(filebuffer,0,readLength); 
     if(sumLength==fileSize){ 
      break; 
     } 
} 
+0

Warum mit dem Schreiben einer Integer-Länge beschäftigen, warum nicht einfach aus dem Sockel bis EOF lesen? –

+0

@JamesKPolk Wenn nicht, liest der Empfänger einen Teil der Dateidatenbytes oder weniger als den ursprünglichen Dateinamen, wenn er die Dateinamenbytes liest, weil er nicht weiß, wie viele Bytes des Dateinamens gelesen werden müssen. – dabaicai