Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Transférer un fichier sur un serveur HTTP


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Transférer un fichier sur un serveur HTTP
    Bonjour,
    j'essaye de créer un programme Java qui permet de transférer un fichier sur un serveur HTTP.
    Pour cela, j'envoie une requête PUT sur le serveur HTTP en passant par une socket:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sock = new Socket("192.168.0.101", 80);
    out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
    out.write("PUT " + path + " HTTP/1.1");
    out.close();
    out.flush();

    Et le serveur web répond bien quand je regarde mon fichier de logs /var/log/apache/access_log.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    192.168.0.101 - - [27/Jan/2007:15:29:45 +0100] "PUT /home/yugiohjcj/dosbox.conf HTTP/1.1" 400 410

    Mais le fichier n'est pas transféré. Il n'est pas présent à la racine de mon serveur web. Pourtant j'y ai mis les droits d'écriture pour tout le monde. D'ailleur je n'ai pas eu à préciser de chemin de déstination...
    Que faut-il que je fasse pour que le fichier y soit?
    Merci.

  2. #2
    Membre régulier
    Ok je viens de lire une doc expliquant le fonctionement de PUT.
    C'est plus complexe que la méthode GET :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    PUT /toto.html HTTP/1.1
     
    Host: www
     
    Content-length: 10
     
     
     
    test 1234

    Donc il faut que je modifie mon programme pour qu'il envoit une requête sous cette forme.

  3. #3
    Membre régulier
    Avec telnet si je fait la requête j'ai une erreur:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    $ telnet localhost 80
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    PUT /toto.txt HTTP/1.1
    Host: www
    Content-length: 10
     
    test 1234
    HTTP/1.1 405 Method Not Allowed
    Date: Sat, 27 Jan 2007 16:08:41 GMT
    Server: Apache/1.3.37 (Unix) PHP/4.4.4
    Allow: GET, HEAD, OPTIONS, TRACE
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=iso-8859-1
     
    12e
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>405 Method Not Allowed</TITLE>
    </HEAD><BODY>
    <H1>Method Not Allowed</H1>
    The requested method PUT is not allowed for the URL /toto.txt.<P>
    <HR>
    <ADDRESS>Apache/1.3.37 Server at YuGiOhJCJ.Geekdomain Port 80</ADDRESS>
    </BODY></HTML>
     
    0
     
    Connection closed by foreign host.


    Donc il va falloir que je configure /etc/apache/httpd.conf pour autoriser le PUT. Mais je sais pas comment faire.

  4. #4
    Membre régulier
    Je viens de lire que Apache ne peut pas répondre à des requêtes PUT sans l'aide d'un script :
    http://www.apacheweek.com/features/put
    Donc il va falloir que je m'en procure un. Mais on me conseil d'utiliser le protocole FTP qui est plus adapté.
    Qu'en pensez-vous?

  5. #5
    Membre régulier
    J'ai du mal à trouver des scripts.
    J'ai obtenu ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?php
    /* Les données PUT arrivent du flux */
    $putdata = fopen("php://input", "r");
     
    /* Ouvre un fichier pour écriture */
    $fp = fopen("myputfile.ext", "w");
     
    /* Lecture des données, 1 Ko à la fois
    and write to the file */
    while ($data = fread($putdata, 1024))
    fwrite($fp, $data);
     
    /* Fermeture du flux */
    fclose($fp);
    fclose($putdata);
    ?>

    J'ai configuré Apache pour qu'il utilise ce script lorsque la méthode PUT est utilisée. Il est lancé ça créé le fichier myputfile.ext mais il est vide...
    Peut être qu'il y a de meilleurs méthodes pour transférer un fichier par le réseau en Java. Qui peut m'aider?

  6. #6
    Membre régulier
    Comme cette méthode pour transférer un fichier est assez complexe, je préfère maintenant essayez celle-ci :
    Un serveur et un client.
    Une DatagramSocket par laquelle est transféré le contenu du fichier.
    Côté client j'ai essayé une lecture caractère par caractère ou ligne par ligne mais je ne m'en sort pas lorsque je souhaite trasnférer par la socket (problème de type car il me faut une String pour convertir en Bytes par la suite ou problème de taille car il ne faut pas dépasser 1024).
    Quelqu'un a une proposition?

  7. #7
    Membre régulier
    Oui c'est pas mal d'utiliser un DatagramPacket à travers une DatagramSocket.
    Par contre, je n'arrive pas à vider mon tableau de bytes.
    Voici mon tableau :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    byte[] donnees_rec = new byte[1024];

    Comment vider son contenu?
    Merci.

  8. #8
    Membre régulier
    si je peux te donner un conseil, plutôt que de vouloir chercher midi à 14h, renseigne toi sur le FTP (File Transfert Protocol) dont c'est le principe de base de permettre le transfert de fichier via le réseau...

    A ma connaissance, la commande PUT du protocole HTTP est plutôt utilisée pour le transfert de données "simples" au serveur HTTP (par exemple les champs d'un formulaire)

  9. #9
    Membre régulier
    Merci mais il semblerai d'après la FAQ de Java sur ce site qu'il n'existe aucun objet dans l'API Java permettant de faire de l'FTP actuellement.

  10. #10
    Membre actif
    Je sais pour FTP, mais pour le HTTP, il y a Jakarta Commons HttpClient et tout ce que tu désires est

    Mieux que de réinventer la roue! Si tu es sûr de vouloir exposer une méthode PUT au monde
    Alex

  11. #11
    Membre régulier
    Nen j'ai un peu laissé tombé la méthode PUT en HTTP.
    Là j'essaye avec les DatagramPacket et SatagramSocket.
    J'ai réussi à peu près. Je suis aussi parvenu à vider mon tableau de bytes.
    Le seul problème c'est que le fichier de destination ne conserve pas les retours à la ligne "\n" donc si le fichier de base est :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    abc
    123

    Le fichier de destination sera:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    abc123

    J'ai essayé de concatener + "\n" à ma String mais pourtant les retours à la ligne n'apparaissent pas dans le fichier de destination...

  12. #12
    Membre régulier
    J'ai trouvé une meilleure solution qui corrige le "\n" manquant : lire caractère par caractère le fichier au lieu de ligne par ligne.
    Maintenant un autre petit problème :
    mon BufferedWriter flux_ecriture sur le serveur ne veut pas se fermer quand je fais un :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Fermeture du flux
    flux_ecriture.close();

    J'obtiens l'erreur du compilateur :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    Depot_serveur.java:53: unreachable statement
    flux_ecriture.close();

    Pourtant sur mon client j'arrive à fermer mon BufferedReader en faisant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Fermeture du flux
    flux_lecture.close();

    Pourquoi ça ne fonctionne pas avec mon BufferedWriter?

  13. #13
    Membre régulier
    J'ai trouvé. J'ai tout simplement décalé l'instruction en dehors du bloc try{}, juste après le catch{} et ça passe...Etrange, je trouvais que l'emplacement de l'instrcution n'était pas problématique.
    Avec des fichiers textes transférés, la copie et identique à l'original :
    j'ai fais un "diff" puis un "cat" sous Linux. Par contre j'ai eu un problème avec des fichiers images (un PNG). Je vais essayer de comprendre pourquoi Gimp me di que le fichier semble être corrompu.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    diff toto.txt ~/Documents/Images/Avatars/yugiohjcj.png
    Les fichiers binaires toto.txt et /home/yugiohjcj/Documents/Images/Avatars/yugiohjcj.png sont différents.

  14. #14
    Membre régulier
    Ouais c'est vraiement étrange, il y a un problème avec les fichiers longs.
    Par exemple si j'essaye de transférer ce fichier texte:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
     
    		    GNU GENERAL PUBLIC LICENSE
    		       Version 2, June 1991
     
     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                              59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
     
    			    Preamble
     
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to most of the Free Software
    Foundation's software and to any other program whose authors commit to
    using it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.
     
      When we speak of free software, we are referring to freedom, not
    price.  Our General Public Licenses are designed to make sure that you
    have the freedom to distribute copies of free software (and charge for
    this service if you wish), that you receive source code or can get it
    if you want it, that you can change the software or use pieces of it
    in new free programs; and that you know you can do these things.
     
      To protect your rights, we need to make restrictions that forbid
    anyone to deny you these rights or to ask you to surrender the rights.
    These restrictions translate to certain responsibilities for you if you
    distribute copies of the software, or if you modify it.
     
      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    rights.
     
      We protect your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.
     
      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and passed on, we
    want its recipients to know that what they have is not the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.
     
      Finally, any free program is threatened constantly by software
    patents.  We wish to avoid the danger that redistributors of a free
    program will individually obtain patent licenses, in effect making the
    program proprietary.  To prevent this, we have made it clear that any
    patent must be licensed for everyone's free use or not licensed at all.
     
      The precise terms and conditions for copying, distribution and
    modification follow.
    
    		    GNU GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
     
      0. This License applies to any program or other work which contains
    a notice placed by the copyright holder saying it may be distributed
    under the terms of this General Public License.  The "Program", below,
    refers to any such program or work, and a "work based on the Program"
    means either the Program or any derivative work under copyright law:
    that is to say, a work containing the Program or a portion of it,
    either verbatim or with modifications and/or translated into another
    language.  (Hereinafter, translation is included without limitation in
    the term "modification".)  Each licensee is addressed as "you".
     
    Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running the Program is not restricted, and the output from the Program
    is covered only if its contents constitute a work based on the
    Program (independent of having been made by running the Program).
    Whether that is true depends on what the Program does.
     
      1. You may copy and distribute verbatim copies of the Program's
    source code as you receive it, in any medium, provided that you
    conspicuously and appropriately publish on each copy an appropriate
    copyright notice and disclaimer of warranty; keep intact all the
    notices that refer to this License and to the absence of any warranty;
    and give any other recipients of the Program a copy of this License
    along with the Program.
     
    You may charge a fee for the physical act of transferring a copy, and
    you may at your option offer warranty protection in exchange for a fee.
     
      2. You may modify your copy or copies of the Program or any portion
    of it, thus forming a work based on the Program, and copy and
    distribute such modifications or work under the terms of Section 1
    above, provided that you also meet all of these conditions:
     
        a) You must cause the modified files to carry prominent notices
        stating that you changed the files and the date of any change.
     
        b) You must cause any work that you distribute or publish, that in
        whole or in part contains or is derived from the Program or any
        part thereof, to be licensed as a whole at no charge to all third
        parties under the terms of this License.
     
        c) If the modified program normally reads commands interactively
        when run, you must cause it, when started running for such
        interactive use in the most ordinary way, to print or display an
        announcement including an appropriate copyright notice and a
        notice that there is no warranty (or else, saying that you provide
        a warranty) and that users may redistribute the program under
        these conditions, and telling the user how to view a copy of this
        License.  (Exception: if the Program itself is interactive but
        does not normally print such an announcement, your work based on
        the Program is not required to print an announcement.)
    
    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Program,
    and can be reasonably considered independent and separate works in
    themselves, then this License, and its terms, do not apply to those
    sections when you distribute them as separate works.  But when you
    distribute the same sections as part of a whole which is a work based
    on the Program, the distribution of the whole must be on the terms of
    this License, whose permissions for other licensees extend to the
    entire whole, and thus to each and every part regardless of who wrote it.
     
    Thus, it is not the intent of this section to claim rights or contest
    your rights to work written entirely by you; rather, the intent is to
    exercise the right to control the distribution of derivative or
    collective works based on the Program.
     
    In addition, mere aggregation of another work not based on the Program
    with the Program (or with a work based on the Program) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.
     
      3. You may copy and distribute the Program (or a work based on it,
    under Section 2) in object code or executable form under the terms of
    Sections 1 and 2 above provided that you also do one of the following:
     
        a) Accompany it with the complete corresponding machine-readable
        source code, which must be distributed under the terms of Sections
        1 and 2 above on a medium customarily used for software interchange; or,
     
        b) Accompany it with a written offer, valid for at least three
        years, to give any third party, for a charge no more than your
        cost of physically performing source distribution, a complete
        machine-readable copy of the corresponding source code, to be
        distributed under the terms of Sections 1 and 2 above on a medium
        customarily used for software interchange; or,
     
        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial distribution and only if you
        received the program in object code or executable form with such
        an offer, in accord with Subsection b above.)
     
    The source code for a work means the preferred form of the work for
    making modifications to it.  For an executable work, complete source
    code means all the source code for all modules it contains, plus any
    associated interface definition files, plus the scripts used to
    control compilation and installation of the executable.  However, as a
    special exception, the source code distributed need not include
    anything that is normally distributed (in either source or binary
    form) with the major components (compiler, kernel, and so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.
     
    If distribution of executable or object code is made by offering
    access to copy from a designated place, then offering equivalent
    access to copy the source code from the same place counts as
    distribution of the source code, even though third parties are not
    compelled to copy the source along with the object code.
    
      4. You may not copy, modify, sublicense, or distribute the Program
    except as expressly provided under this License.  Any attempt
    otherwise to copy, modify, sublicense or distribute the Program is
    void, and will automatically terminate your rights under this License.
    However, parties who have received copies, or rights, from you under
    this License will not have their licenses terminated so long as such
    parties remain in full compliance.
     
      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Program (or any work based on the
    Program), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Program or works based on it.
     
      6. Each time you redistribute the Program (or any work based on the
    Program), the recipient automatically receives a license from the
    original licensor to copy, distribute or modify the Program subject to
    these terms and conditions.  You may not impose any further
    restrictions on the recipients' exercise of the rights granted herein.
    You are not responsible for enforcing compliance by third parties to
    this License.
     
      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),
    conditions are imposed on you (whether by court order, agreement or
    otherwise) that contradict the conditions of this License, they do not
    excuse you from the conditions of this License.  If you cannot
    distribute so as to satisfy simultaneously your obligations under this
    License and any other pertinent obligations, then as a consequence you
    may not distribute the Program at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Program by
    all those who receive copies directly or indirectly through you, then
    the only way you could satisfy both it and this License would be to
    refrain entirely from distribution of the Program.
     
    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply in other
    circumstances.
     
    It is not the purpose of this section to induce you to infringe any
    patents or other property right claims or to contest validity of any
    such claims; this section has the sole purpose of protecting the
    integrity of the free software distribution system, which is
    implemented by public license practices.  Many people have made
    generous contributions to the wide range of software distributed
    through that system in reliance on consistent application of that
    system; it is up to the author/donor to decide if he or she is willing
    to distribute software through any other system and a licensee cannot
    impose that choice.
     
    This section is intended to make thoroughly clear what is believed to
    be a consequence of the rest of this License.
    
      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Program under this License
    may add an explicit geographical distribution limitation excluding
    those countries, so that distribution is permitted only in or among
    countries not thus excluded.  In such case, this License incorporates
    the limitation as if written in the body of this License.
     
      9. The Free Software Foundation may publish revised and/or new versions
    of the General Public License from time to time.  Such new versions will
    be similar in spirit to the present version, but may differ in detail to
    address new problems or concerns.
     
    Each version is given a distinguishing version number.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any later version published by the Free
    Software Foundation.  If the Program does not specify a version number of
    this License, you may choose any version ever published by the Free Software
    Foundation.
     
      10. If you wish to incorporate parts of the Program into other free
    programs whose distribution conditions are different, write to the author
    to ask for permission.  For software which is copyrighted by the Free
    Software Foundation, write to the Free Software Foundation; we sometimes
    make exceptions for this.  Our decision will be guided by the two goals
    of preserving the free status of all derivatives of our free software and
    of promoting the sharing and reuse of software generally.
     
    			    NO WARRANTY
     
      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
    REPAIR OR CORRECTION.
     
      12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
    TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
    POSSIBILITY OF SUCH DAMAGES.
     
    		     END OF TERMS AND CONDITIONS
    
    	Appendix: How to Apply These Terms to Your New Programs
     
      If you develop a new program, and you want it to be of the greatest
    possible use to the public, the best way to achieve this is to make it
    free software which everyone can redistribute and change under these terms.
     
      To do so, attach the following notices to the program.  It is safest
    to attach them to the start of each source file to most effectively
    convey the exclusion of warranty; and each file should have at least
    the "copyright" line and a pointer to where the full notice is found.
     
        <one line to give the program's name and a brief idea of what it does.>
        Copyright (C) 19yy  <name of author>
     
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation; either version 2 of the License, or
        (at your option) any later version.
     
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
     
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
     
    Also add information on how to contact you by electronic and paper mail.
     
    If the program is interactive, make it output a short notice like this
    when it starts in an interactive mode:
     
        Gnomovision version 69, Copyright (C) 19yy name of author
        Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
        This is free software, and you are welcome to redistribute it
        under certain conditions; type `show c' for details.
     
    The hypothetical commands `show w' and `show c' should show the appropriate
    parts of the General Public License.  Of course, the commands you use may
    be called something other than `show w' and `show c'; they could even be
    mouse-clicks or menu items--whatever suits your program.
     
    You should also get your employer (if you work as a programmer) or your
    school, if any, to sign a "copyright disclaimer" for the program, if
    necessary.  Here is a sample; alter the names:
     
      Yoyodyne, Inc., hereby disclaims all copyright interest in the program
      `Gnomovision' (which makes passes at compilers) written by James Hacker.
     
      <signature of Ty Coon>, 1 April 1989
      Ty Coon, President of Vice
     
    This General Public License does not permit incorporating your program into
    proprietary programs.  If your program is a subroutine library, you may
    consider it more useful to permit linking proprietary applications with the
    library.  If this is what you want to do, use the GNU Library General
    Public License instead of this License.

    Le fichier de destination sera:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    		    GNU GENERAL PUBLIC LICENSE
    		       Version 2, June 1991
     
     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                              59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.
     
    			    Preamble
     
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    License is intended to guarantee your freedom to share and change free
    software--to make sure the software is free for all its users.  This
    General Public License applies to ng it.  (Some other Free Software Foundation software is covered by
    the GNU Library General Public License instead.)  You can apply it to
    your programs, too.
     
      When we speak of free software, we are referring to freedn responsibilities for you if you
    distribute copies of the software, or if you modify it.
     
      For example, if you distribute copies of such a program, whether
    gratis or for a fee, you must give the recipients all the rights that
    you have.  You must make sure that they, too, receive or can get the
    source code.  And you must show them these terms so they know their
    righ your rights with two steps: (1) copyright the software, and
    (2) offer you this license which gives you legal permission to copy,
    distribute and/or modify the software.
     
      Also, for each author's protection and ours, we want to make certain
    that everyone understands that there is no warranty for this free
    software.  If the software is modified by someone else and pa the original, so
    that any problems introduced by others will not reflect on the original
    authors' reputations.
     
      Finally, any free prograis y program or other work which contains
    a notice placed by the copyent of having been made by running the Program).
    Wheth for software interchange; or,
     
        c) Accompany it with the information you received as to the offer
        to distribute corresponding source code.  (This alternative is
        allowed only for noncommercial dind so on) of the
    operating system on which the executable runs, unless that component
    itself accompanies the executable.
     
    If distribution of executable or object code is made by offering
    access to copy fropliance.
     
      5. You are not required to accept this License, since you have not
    signed it.  However, nothing else grants you permission to modify or
    distribute the Program or its derivative works.  These ansible for enforcing compliance by third parties to
    this License.
     
      7. If, as a consequence of a court judgment or allegation of patent
    infringement or for any other reason (not limited to patent issues),gram.
     
    If any portion of this section is held invalid or unenforceable under
    any particular circumstance, the balance of the section is intended to
    apply and the section as a whole is intended to apply inded to make thoroughly clear what is believed to
    be a consequence of the rest of this License.
    
      8. If the distribution and/or use of the Program is restricted in
    certain countries either by patents or bmber.  If the Program
    specifies a version number of this License which applies to it and "any
    later version", you have the option of following the terms and conditions
    either of that version or of any latf software generally.
     
    			    NO WARRANTY
     
      11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
    OTHERWISE STATOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
    YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
    PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISyright (C) 19yy  <name of author>
     
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Fo
    when it starts in an interactive mode:
     
        Gnomovision version 69, Copyright (C) 19yy name of author
        Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
        This is free softwarat compilers) written by James Hacker.
     
      <signature of Ty Coon>, 1 April 1989
      Ty Coon, President of Vice
     
    This General Public License does not permit incorporating your program into
    proprietary program

    Le plus étrange c'est que si je recommence cette opération avec le même fichier, le fichier de destination sera peut être plus court ou plus long...D'un coup le serveur s'arrête de recevoir les données du client... Je ne sais pas pourquoi. Par contre le client envoie toujours les mêmes données, il envoit donc probablement l'intégralité du fichier.
    J'ai vérifié avec un fichier image PNG très petit (2*2pixels) et le fichier de destination n'était pas corrompu et identique à l'original j'ai pu le lire sous Gimp.
    Que dois-je faire pour que les gros fichiers puissent transiter également?

  15. #15
    Membre régulier
    Mon prof de réseau à l'IUT me dit que ça risque de venir du protocole UDP utilisé. Je devrais peut être passer par du TCP. J'essaierai ça plus tard.
    J'ai un autre problème qui est apparu :
    j'essaye de convertir une String en un int. J'ai trouvé ces 2 méthodes :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    //i = Integer.parseInt( new String(paquet_rec.getData()) );
    i = Integer.valueOf( new String(paquet_rec.getData()) ).intValue();

    Mais mon compilateur dit:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Exception in thread "main" java.lang.NumberFormatException: For input string: "4"
            at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
            at java.lang.Integer.parseInt(Integer.java:456)
            at java.lang.Integer.valueOf(Integer.java:553)
            at Depot_serveur.main(Depot_serveur.java:73)


    Qu'est-ce que cette erreur signifie?
    Quelle est mon erreur à votre avis?

  16. #16
    Membre régulier
    Je me suis renseigné et cette erreur signifie que ma String ne semble pas être un nombre. Pourtant on voit bien dans le message d'erreur que la String = "4" donc c'est bien un nombre.
    Qu'en pensez-vous?

  17. #17
    Membre régulier
    Je viens de trouver une solution : préciser que ma String ne fait seulement qu'un caractère. Il y avait donc des caractères invisbles qui génaient la conversion :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    System.out.println(
    					(2 + 
    						Integer.parseInt(
    							new String( paquet_rec.getData(), 0, 1 )
    						)
    					)
    );

    Le résultat donne 6 et l'erreur n'appraît plus.
    Le problème c'est que ma String risque d'avoir une longeur supérieure à 1 caractère parfois...Puisque elle contient le nombre de caractères dans le fichier que je souhaite transférer par le réseau.
    Il faut que je trouve une solution...

  18. ###raw>post.musername###
    Membre régulier
    J'ai trouvé cette solution:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String[] toto = new String(paquet_rec.getData()).split("\\D");
    //Conversion en entier
    i = Integer.parseInt(toto[0]);

    Ca
      0  0

  19. ###raw>post.musername###
    Membre régulier
    J'ai trouvé cette solution:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String[] toto = new String(paquet_rec.getData()).split("\\D");
    //Conversion en entier
    i = Integer.parseInt(toto[0]);

    Ca marche bien.
    Maintenant, j'ai toujours le problème avec les gros fichiers, l'UDP c'est pas super. Je tente donc en TCP avec Socket et ServerSocket.
    Voilà ce que je fais sur le serveur :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
                    /*-----------------------------------*
    		 | DECLARATION DES VARIABLES LOCALES |
    		 *-----------------------------------*/
    		//La socket serveur
    		ServerSocket serveur_socket = null;
    		//La socket services
    		Socket services_socket = null;
     
    		/*-------------------------------*
    		 | CREATION DE LA SOCKET SERVEUR |
    		 *-------------------------------*/
    		try{
    			serveur_socket = new ServerSocket(5555);
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}
     
    		/*--------------------------------*
    		 | CREATION DE LA SOCKET SERVICES |
    		 *--------------------------------*/
    		try{
    			services_socket = new Socket("192.168.0.101", 5555);
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}
     
    		/*--------------------------------*
    		 | Récupération du nom du fichier |
    		 *--------------------------------*/
    		try{
    			//Boucle infinie
    			while(true){
    				//Attendre les clients
    				services_socket = serveur_socket.accept();
    				//Récupérer le flux de données
    				BufferedReader flux_entree = new BufferedReader(
    					new InputStreamReader(
    						services_socket.getInputStream()
    					)
    				);
    				String donnees_recues = flux_entree.readLine();
    				System.out.println("Données reçues : " + donnees_recues);
    			}
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}

    Côté client :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
                                                            //Creation de la socket client
    							Socket client_socket = null;
    							try{
    								//Création de la socket client
    								client_socket = new Socket("192.168.0.101", 5555);
    								//Envoyer le flux de données
    								String donnees_envoyees = name;
    								DataOutputStream flux_entree = new DataOutputStream(
    									client_socket.getOutputStream()
    								);
    								flux_entree.writeBytes(donnees_envoyees);
    								System.out.println("Données envoyées : " + donnees_envoyees);
    							}
    							catch(IOException ex){
    								System.err.println(ex);
    							}


    En bref, je créé une ServerSocket sur le serveur, puis je lui associe une Socket pour permettre de communiquer avec les clients. Sur le client, je créé une Socket.
    Le client envoie mais le serveur ne réagit pas.
    Comment ça se fait?
      0  0

  20. #20
    Membre régulier
    Oui ça y est j'ai trouvé mon erreur il y a quelques jours : ma socket de services ne doit pas s'initialiser comme ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /*--------------------------------*
    		 | CREATION DE LA SOCKET SERVICES |
    		 *--------------------------------*/
    		try{
    			services_socket = new Socket("192.168.0.101", 5555);
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}

    Mais seulement en l'associant au résultat de la méthode accept() de la ServerSocket.
    J'arrive à envoyer un paquet vers le serveur qui le réceptionne.
    Par contre dès que je veux dialoguer :
    client->envoi->serveur
    serveur->reçoit->client
    serveur->envoi->client
    client->recoit->serveur
    client->envoi->serveur
    serveur->reçoit->client
    serveur->envoi->client
    client->recoit->serveur
    ...
    Et bien j'ai des problèmes pendant l'execution du programme du genre broken pipe. Ou encore après que le serveur accept() le client, il bloque et ne parviens pas à recevoir le flux.
    Côté serveur :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ java Depot_serveur
    Centre Multimédia - Application de dépôt
    Le serveur est en état de marche (0.0.0.0/0.0.0.0:5555).
    Un client souhaite envoyer un fichier...

    Côté client :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    java Depot
    Données envoyées : abc