2013-01-17 12 views
-1

Je tente de transférer un fichier d'un ordinateur à un autre en utilisant TCP/IP. J'ai écrit le code en Java comme indiqué ci-dessous. Cependant, le code ne fonctionne pas et après avoir utilisé plusieurs blocs catch, j'ai découvert que cela était dû à une exception SocketException. quelqu'un peut-il me dire comment résoudre ce problème? Voici mon code-SocketException en Java: Transfert de fichiers via TCP/IP

TCPClient

import java.net.*; 

de import java.io. ; import java.util.;

public class TCPClient {

public static void main (String args[]) 
    { 
    try 
    { 
     Socket sock = new Socket("localhost", 6839); 
     InputStream is = null; 
     FileOutputStream out = null; 
     boolean doesntexist=false; 
     String filename = "D:\\"+"Test"+".pdf"; 
     System.out.println("Here!"); 
     File newplaylist = new File(filename); 
     doesntexist = newplaylist.createNewFile(); 

     if(!doesntexist) 
     { 
      newplaylist.delete(); 
      newplaylist.createNewFile(); 
     } 


     byte[] mybytearray = new byte[1024]; 

     is = sock.getInputStream(); 
           // Create a new file output stream. 
     out = new FileOutputStream(newplaylist); 

     int count; 
     while ((count = is.read(mybytearray)) >= 0) { 
      out.write(mybytearray, 0, count); 
     } 
     out.close(); 
     is.close(); 
     sock.close(); 
    }  
     catch(SocketException e) 
     { 
     System.out.println("Socket exception"); 
     } 
     catch(ProtocolException e) 
     { 
      System.out.println("Protocol exception"); 
     } 
     catch(IOException ds) 
     { 
      ; 
     } 
    } 

}

TCPServer

import java.util.*; 
import java.io.*; 
import java.net.*; 
import java.nio.channels.*; 

class Fileserver 
{ 
    public static void main(String args[]) throws IOException 
    { 
    ServerSocket server = new ServerSocket(6839); 
    File myFile = new File("E:\\file1.pdf"); 
    FileInputStream file = null; 
    OutputStream os = null; 
    Socket sock=null; 

    sock = server.accept(); 

    try 
    { 

     byte[] mybytearray = new byte[1024]; 
     file = new FileInputStream(myFile); 
     os = sock.getOutputStream(); 


     int count; 
     while ((count = file.read(mybytearray)) >= 0) { 
      os.write(mybytearray, 0, count); 

     } 

     os.flush(); 
    } 


     catch(IOException e) 
     { 
      System.out.println("No file"); 
     } 
     catch(IllegalBlockingModeException ea) 
     { 
      System.out.println("blah!"); 
     } 

    finally 
    { 
     System.out.println("hello"); 
     file.close(); 
     os.close(); 
     sock.close(); 

     System.out.println("Socket closed"); 
    } 

    } 

}

+0

Ne créez pas vos propres messages d'erreur. Utilisez celui de l'exception.Et * jamais * ignorer une exception d'E/S. – EJP

Répondre

1

Votre code gaspille toutes les informations de diagnostic utiles qui w mal faire comprendre ce que le problème est pratiquement impossible. (Et en ignorant complètement IOException comme ça est limitrophe criminel!)

La façon de résoudre ce problème, procédez comme suit:

  • Modifier les programmes aux messages d'exception de sortie et des traces de pile lorsqu'une exception inattendue se produit.
  • Exécutez les programmes.
  • Si/quand ils échouent, examinez les diagnostics et déterminez ce qu'ils signifient ... ou ajoutez-les à la Question afin que nous puissions vous aider.

Un délai d'attente de connexion indique généralement il y a une sorte de problème au niveau du réseau. Par exemple, la machine à laquelle vous essayez de vous connecter est morte (ou n'existe pas), les paquets ne sont pas acheminés correctement ou sont supprimés par un pare-feu.

Mais dans ce cas, le problème est que vous essayez (apparemment) d'utiliser "localhost" pour communiquer avec une autre machine. Cela ne fonctionnera tout simplement pas. Le nom "localhost" résout conventionnellement à une adresse sur le sous-réseau de bouclage; par exemple. 127.0.0.1. Le trafic de bouclage ne quitte jamais la machine à partir de laquelle il est envoyé ... donc vous ne pouvez utiliser que "localhost" pour vous connecter à quelque chose dans cette machine.

(Étant donné que rien n'écoute les connexions au port désigné sur cette machine,, les paquets TCP pour ouvrir la connexion sont abandonnés. la tentative de connexion et la bibliothèque de socket Java lève l'exception que vous voyez.)

La solution consiste à remplacer "localhost" par un nom DNS ou une adresse IP pour l'ordinateur auquel vous essayez de parler.

+0

Après avoir imprimé le stacktrace, ce sont les informations I Get- java.net.ConnectException: connexion a expiré: connecter \t à java.net.DualStackPlainSocketImpl.connect0 (Méthode natif) \t à java.net.DualStackPlainSocketImpl.socketConnect (DualStackPlainSocketImpl.java:69) \t java.net.ConnectException: connexion a expiré: connecter \t à java.net.DualStackPlainSocketImpl.connect0 (Méthode natif) \t à java.net.DualStackPlainSocketImpl.socketConnect (DualStackPlainSocketImpl.java:69) \t at java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:337) –

+0

Je suis placé par l'adresse IP de mon serveur dans le code client. Cependant, je reçois toujours le même problème. Cela a fonctionné une fois et j'ai été en mesure de transférer les fichiers, mais depuis lors, il a été expiré. Merci de m'avoir aidé ... –

+0

Dans ce cas, vous devriez regarder les configurations réseau. Ce n'est pas vraiment un problème de programmation. –

Questions connexes