2010-10-13 6 views
0

client:problème de programmation socket java

import java.io.*; 
    import java.net.*; 
    public class Requester 
    { 
     Socket requestSocket; 
     ObjectOutputStream out; 
     ObjectInputStream in; 
     String message; 
     BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
     Requester(){} 
     void run() throws IOException 
     { 
      try{ 
       //1. creating a socket to connect to the server 
       requestSocket = new Socket("172.16.3.219", 2004); 
       System.out.println("Connected to localhost in port 2004"); 

       //2. get Input and Output streams 
       out = new ObjectOutputStream(requestSocket.getOutputStream()); 
       out.flush(); 
       in = new ObjectInputStream(requestSocket.getInputStream()); 

       //3: Communicating with the server 
       do{ 
        try{ 
         message = (String)in.readObject(); 
         System.out.println("server>" + message); 
         message=br.readLine(); 
         sendMessage(message); 
        } 
         catch(ClassNotFoundException classNot) 
         { 
          System.err.println("data received in unknown format"); 
        } 
       }while(!message.equals("bye")); 
       } 
       catch(UnknownHostException unknownHost) 
       { 
       System.err.println("You are trying to connect to an unknown host!"); 
       } 
       catch(IOException ioException) 
       { 
       ioException.printStackTrace(); 
       } 
       finally 
       { 
       //4: Closing connection 
       try{ 
        in.close(); 
        out.close(); 
        requestSocket.close(); 
        } 
        catch(IOException ioException) 
        { 
        ioException.printStackTrace(); 
        } 
       } 
     } 
     void sendMessage(String msg) 
     { 
      try{ 
       out.writeObject(msg); 
       out.flush(); 
       System.out.println("client1>" + msg); 
       } 
       catch(IOException ioException) 
       { 
       ioException.printStackTrace(); 
       } 
     } 
     public static void main(String args[]) throws IOException 
     { 
      Requester client = new Requester(); 
      client.run(); 
     } 
    } 

serveur:

import java.io.*; 
import java.net.*; 
public class Provider 
{ 
    ServerSocket providerSocket; 
    Socket connection = null; 
    ObjectOutputStream out; 
    ObjectInputStream in; 
    String message; 
    Provider(){} 
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 

    void run() 
    { 
     try{ 
      //1. creating a server socket 
      providerSocket = new ServerSocket(2004, 10); 

      //2. Wait for connection 
      System.out.println("Waiting for connection"); 

       connection = providerSocket.accept(); 
       System.out.println("Connection received from" + connection.getInetAddress().getHostName()); 

      //3. get Input and Output streams 
       out = new ObjectOutputStream(connection.getOutputStream()); 
      out.flush(); 
      in = new ObjectInputStream(connection.getInputStream()); 
      sendMessage("Connection successful"); 

      //4. The two parts communicate via the input and output streams 
      do 
      { 
       try 
       { 
        message = (String)in.readObject(); 
        System.out.println("client>" + message); 

        if (message.equals("bye")) 
        { 
         sendMessage("bye"); 
        } 
         else 
        { 
         message=br.readLine(); 
         sendMessage(message); 
        } 
       } 
       catch(ClassNotFoundException classnot) 
       { 
       System.err.println("Data received in unknown format"); 
       } 
      }while(!message.equals("bye")); 
     } 
     catch(IOException ioException) 
     { 
      ioException.printStackTrace(); 
     } 
     finally 
     { 
      //4: Closing connection 
      try{ 
         in.close(); 
         out.close(); 
         providerSocket.close(); 
       } 
       catch(IOException ioException) 
       { 
          ioException.printStackTrace(); 
       } 
      } 
    } 

     void sendMessage(String msg) 
    { 
     try 
     { 
      out.writeObject(msg); 
      out.flush(); 
      System.out.println("server>" + msg); 
     } 
     catch(IOException ioException) 
     { 
      ioException.printStackTrace(); 
     } 
    } 
    public static void main(String args[])throws IOException 
    { 
     Provider server = new Provider(); 
     while(true) 
     { 
     server.run(); 
     } 
    } 
}                                                    
programme

Server est à 172.16.3.219. Si le serveur et le client sont dans un système (172.16.3.219), les programmes fonctionnent. Si un programme mon client est placé dans un autre système, disons 172.16.3.30 je reçois des exceptions (le serveur est toujours au 172.16.3.219). Dois-je changer le constructeur socket(). Si le problème est avec le constructeur me suggérer le constructeur approprié lorsque le client et le serveur sont dans des systèmes différents

+0

Quelles exceptions? Montrez-nous la trace de la pile. –

+0

Quelle exception obtenez-vous? –

+1

à java.net.PlainSocketImpl.socketConnect (Méthode natif) à java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:310) à java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java:176) à java.net .AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java:163) à java.net.SocksSocketImpl.connect (SocksSocketImpl.java:384) à java.net.Socket.connect (Socket.java:542) à java.net.Socket .connect (Socket.java:492) à java.net.Socket. (Socket.java:389) – Jagan

Répondre

2

Le code semble OK; Avez-vous un pare-feu sur le client ou le serveur?

J'essayais de tester le code qui envoyait le courrier. Pour cela, j'ai installé un serveur de messagerie local mais je n'ai pas pu me connecter: Les administrateurs avaient désactivé le port SMTP pour arrêter les spammeurs.

[EDIT] "Connexion refusée" signifie qu'aucun serveur n'est en cours d'exécution sur ce port sur ce serveur. Exécutez netstat -tan (Linux) ou netstat -tn (Windows) et recherchez les lignes avec LISTEN. Ce sont les processus du serveur en cours d'exécution. La sortie ressemblera à ceci:

Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  
tcp  0  0 0.0.0.0:8080   0.0.0.0:*    LISTEN  
tcp  0  0 127.0.0.1:631   0.0.0.0:*    LISTEN  

La partie intéressante est "Adresse locale". Il contient l'interface réseau (adresse IP) sur laquelle le serveur écoute. La première entrée écoute sur toutes les interfaces réseau tandis que la seconde est attachée à "localhost" (également appelé "loopback local"). Il ignorera toutes les tentatives de connexion du réseau local.

Assurez-vous que votre serveur est répertorié avec 0.0.0.0:2004. Dans le cas contraire, essayez:

providerSocket = ServerSocket(2004, 10, InetAddress.getByName("0.0.0.0")); 

Si cela ne fonctionne pas, essayez l'adresse IP publique de la carte réseau du serveur.

+0

J'ai désactivé le mur à l'épreuve du feu et exécuté ... toujours obtenir l'exception. Exception dans le fil "principal" java.lang.NullPointerException à Requester.run (Requester.java:50) à Requester.main (Requester.java:74) – Jagan

+0

java.net.ConnectException: connexion refusée. Ceci est une autre exception. – Jagan

+0

Je vois. J'ai édité ma réponse; voir si ça aide. –

1

Je suppose (pour une raison quelconque) que le serveur n'écoute que l'adresse IP de bouclage. Essayez de lier sur une adresse IP spécifique, quelque chose comme:

//1. creating a server socket 
providerSocket = ServerSocket(2004, 10, InetAddress.getByName("172.16.3.219"));