2013-09-28 3 views
0

Для домашней работы я пытаюсь отправить файл и некоторый параметр, соответствующий этому файлу. Итак, я отправляю свой файл и после своей строки. Проблема заключается в том, что мой параметр перешел в мой файл, а не в переменную. Я понимаю проблему, мой цикл, продолжая писать в файле, пока он что-то получает, но я хочу остановить его и отключить свой параметр вне моего файла.java socket buffer и string

Вот мой код клиент:

public static void transfert(InputStream in, OutputStream out) throws IOException{ 
     PrintWriter printOut; 
     byte buf[] = new byte[1024]; 
     int n; 
     while((n=in.read(buf))!=-1) 
      out.write(buf,0,n); 


     printOut = new PrintWriter(out); 
     printOut.println("add"); 
     System.out.println("envoie !!!"); 
     printOut.println("1"); 
     printOut.println("3"); 
     // out.write(getBytes("add"),0,0); 
     printOut.flush(); 
    } 

и вот мой код сервера:

public static void transfert(InputStream in, OutputStream out, boolean closeOnExit) throws IOException 
    {   
     byte buf[] = new byte[1024]; 

     int n; 
     while((n=in.read(buf))!=-1) 
      out.write(buf,0,n); 

     buffIn = new BufferedReader (new InputStreamReader(in)); 
     String nom_methode = buffIn.readLine(); 
     String param1 = buffIn.readLine(); 
     String param2 = buffIn.readLine(); 
     System.out.println("methode:"+nom_methode+"param1:"+param1+"param2:"+param2); 

     if (closeOnExit) 
     { 
      in.close(); 
      out.close(); 
     }  
    } 

редактировать: я до сих пор что-то пропустил, теперь у меня есть ошибка с моей темой, я думаю, что проблема из моего цикла, который читает мой файл на входе. Кроме того, на самом деле параметр все еще находится в моем файле, а не в моем параметре ... Почему цикл не останавливается после EOF?

ошибка:

Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:318) 
    at serveurthread.AcceptClient.transfert(AcceptClient.java:45) 
    at serveurthread.AcceptClient.run(AcceptClient.java:84) 
    at java.lang.Thread.run(Thread.java:722) 

client: 
public static void transfert(InputStream in, OutputStream out) throws IOException{ 
     PrintWriter printOut; 
     printOut = new PrintWriter(out); 
     byte buf[] = new byte[1024]; 
     int n; 
     while((n=in.read(buf))!=-1) 
      out.write(buf,0,n); 


     printOut.print('\u0004'); 
     printOut.flush(); 
     printOut.println("add"); 
     System.out.println("envoie !!!"); 
     printOut.println("1"); 
     printOut.println("3"); 
     // out.write(getBytes("add"),0,0); 
     printOut.flush(); 
    } 

сервер:

public static void transfert(InputStream in, OutputStream out, boolean closeOnExit) throws IOException 
    {   
     byte buf[] = new byte[1024]; 

    int n; 
    while((n=in.read(buf))!= (int)'\u0004'){ 
     out.write(buf,0,n); 
    } 

    buffIn = new BufferedReader (new InputStreamReader(in)); 
    String nom_methode = buffIn.readLine(); 
    String param1 = buffIn.readLine(); 
    String param2 = buffIn.readLine(); 
    System.out.println("methode:"+nom_methode+"param1:"+param1+"param2:"+param2); 

    if (closeOnExit) 
    { 
     in.close(); 
     out.close(); 
    }  
} 

ответ

-1

Вы будете нуждаться в какой-то маркер в вашем потоке, что означает конец файла. Я предлагаю '\u0004', который является символом EOF. В принципе, писать этот символ после записи файла, а затем настроить петлю на сервере, как это:

while((n=in.read(buf))!=(int)'\u0004') 
    out.write(buf,0,n); 

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

Кроме того, read возвращает количество прочитанных байтов, а не символ. Я передавал бы один байт за один раз, объявляя байты вместо байтовых массивов.

+1

read (byte []) возвращает счет, а не символ из потока. -1 – EJP

+0

Я, наконец, отправляю все по строке и меняю свой строковый файл на байт на моем сервере. – user1904731