2010-01-29 5 views
18

J'écris mon premier programme client/serveur java qui établit simplement une connexion avec le serveur lui envoie une phrase et le serveur renvoie la phrase en majuscule. C'est en fait un exemple tout droit sorti du livre, et ça marche bien et bien quand je cours le client et le serveur sur la même machine et en utilisant localhost pour l'adresse du serveur. Mais quand je mets le programme client sur un autre ordinateur, il expire et ne fait jamais de connexion avec le serveur. Je ne suis pas sûr pourquoi c'est et son genre de lame faire un premier client/serveur et ne pas être en mesure de l'utiliser sur deux machines différentes. Voici le code client:Programme client/serveur Java simple

import java.io.*; 
import java.net.*; 

public class TCPClient { 
    public static void main(String argv[]) throws Exception { 
     String sentence; 
     String modifiedSentence; 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 

     Socket clientSocket = new Socket("localhost", 6789); 
     DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); 
     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     sentence = inFromUser.readLine(); 
     outToServer.writeBytes(sentence + '\n'); 
     modifiedSentence = inFromServer.readLine(); 
     System.out.println(modifiedSentence); 
     clientSocket.close(); 
    } 
} 

Voici le code du serveur:

import java.io.*; 
import java.net.*; 

public class TCPServer { 
    public static void main(String args[]) throws Exception { 
     String clientSentence; 
     String capitalizedSentence; 
     ServerSocket welcomeSocket = new ServerSocket(6789); 

     while(true) { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      capitalizedSentence = clientSentence.toUpperCase() + '\n'; 
      outToClient.writeBytes(capitalizedSentence); 
     } 
    } 
} 

La seule chose que je change quand je le lance sur deux machines différentes est le programme client fait son socket avec l'adresse IP de la machine avec le programme serveur (que j'ai obtenu de whatismyipaddress.com). Merci beaucoup pour toute aide.

Mise à jour: Je suis en effet sur un campus et il semble que cela ne me permette probablement pas d'utiliser ce port aléatoire. Des suggestions pour savoir quel port je peux utiliser et quel port est plus que probablement autorisé?

+1

Et vous pouvez vous connecter au serveur via cette adresse IP autrement? (En utilisant ping/telnet/traceroute/etc.) – McDowell

+0

Avant d'essayer de déboguer le programme, essayez peut-être de vous assurer que vous pouvez faire un ping sur l'autre ordinateur en premier. De cette façon, vous savez que le réseau n'est pas à blâmer. –

+0

J'ai essayé le ping et cela a fonctionné. – Anton

Répondre

8

Il s'agit probablement d'un problème de pare-feu. Assurez-vous de transférer le port auquel vous souhaitez vous connecter sur le serveur. localhost correspond directement à une adresse IP et se déplace également dans votre pile réseau. Vous changez du texte dans votre code, mais la façon dont votre programme fonctionne est fondamentalement la même.

+0

Essayez de tester la connexion à votre serveur avec telnet à partir d'une machine client. Si vous obtenez une «connexion refusée» ou un délai d'attente, c'est un problème de pare-feu –

+1

Si vous êtes à l'école, vous avez presque certainement un routeur. Ping n'aidera pas beaucoup; il vérifie que la machine est joignable, mais pas si votre port est ouvert. Vous pouvez essayer d'utiliser votre navigateur pour vous connecter à la machine distante, vous devriez obtenir quelque chose comme "GET/HTTP 1.1". Ou vous pourriez essayer quelque chose comme une boucle. – TMN

1

Si vous avez reçu votre adresse IP d'un site Web externe (http://whatismyipaddress.com/), vous avez votre adresse IP externe. Si votre serveur est sur le même réseau local, vous pouvez avoir besoin d'une adresse IP interne à la place. Local IP addresses ressemblent à 10.X.X.X, 172.X.X.X ou 192.168.X.X.

Essayez les suggestions sur this page pour trouver ce que votre machine pense son adresse IP.

+0

(Notez que toutes les adresses 172.X.X.X ne sont pas locales.) –

+0

Je l'ai eu de ipconfig aussi bien que c'était pareil. – Anton

1

Au lieu d'utiliser l'adresse IP de whatismyipaddress.com, que se passe-t-il si vous obtenez simplement l'adresse IP directement de la machine et la branchez? whatismyipaddress.com vous donnera l'adresse de votre routeur (je suppose que vous êtes sur un réseau domestique). Je ne pense pas que la redirection de port fonctionnera puisque votre demande viendra de l'intérieur du réseau, pas à l'extérieur.

+0

J'ai fait ipconfig aussi et il a donné la même adresse que whatismyipaddress.com – Anton

+0

Êtes-vous sur un réseau de campus ou quelque chose? Ils peuvent avoir leurs commutateurs/routeurs configurés pour bloquer certains ports, même à l'intérieur du réseau. Si vous pouvez exécuter une commande ping sur l'autre machine alors que cela ne fonctionne pas, ce port peut être bloqué. – Neal

+0

Oui, je suis sur un campus, je suppose que je devrais essayer avec le port 80 et voir si j'ai de la chance? – Anton

3

Il existe un concept fondamental de routage IP: Vous devez avoir une adresse IP unique si vous voulez que votre machine soit accessible via Internet. C'est ce qu'on appelle une "adresse IP publique". "www.whatismyipaddress.com" vous donnera ceci. Si votre serveur est derrière une passerelle par défaut, les paquets IP vous atteindront via ce routeur. Vous ne pouvez pas être contacté via votre adresse IP privée du monde extérieur. Vous devriez noter que les adresses IP privées du client et du serveur peuvent être identiques tant que leurs passerelles par défaut correspondantes ont des adresses différentes (c'est pourquoi IPv4 est toujours en vigueur) Je suppose que vous essayez d'envoyer une requête ping de votre adresse privée de votre client vers l'adresse IP publique du serveur (fournie par whatismyipaddress.com). Ce n'est pas faisable. Pour ce faire, un mappage de l'adresse privée à l'adresse publique est requis, un processus appelé Network Address Translation ou NAT en abrégé. Ceci est configuré dans le pare-feu ou le routeur. Vous pouvez créer votre propre réseau privé (disons via wifi). Dans ce cas, étant donné que votre client et votre serveur se trouveraient sur le même réseau logique, aucune traduction d'adresse privée vers une adresse publique ne serait nécessaire et vous ne pourrez donc communiquer qu'avec vos adresses IP privées. Outstream n'est pas fermé ... fermez le flux de sorte que la réponse revienne au client test.

0

J'espère que cela aide.

0

Vous pouvez obtenir ip de cet ordinateur exécute le programme serveur à partir de la liste DHCP dans le routeur auquel vous vous êtes connecté.

+0

Pouvez-vous reformuler cette réponse pour la clarifier? Je ne pense pas que ce que vous vouliez dire soit très clair. – skrrgwasme

+0

Je voulais dire au lieu d'écrire 'Socket clientSocket = new Socket (" localhost ", 6789);' localhost signifie le même ordinateur donc il doit trouver l'adresse IP de l'ordinateur qui exécute le serveur. Si routeur utilisé dans ce cas: il peut alors ouvrir la page web du routeur pour trouver la liste DHCP qui montrera les appareils connectés au routeur avec une adresse IP pour chaque périphérique. – user3417593

0

Mon essayer de faire le programme socket client

serveur

lit le fichier et l'imprimer à la console et la copie dans le fichier de sortie

Server Program:

package SocketProgramming.copy; 

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ServerRecieveFile { 
    public static void main(String[] args) throws IOException { 
     // TODO Auto-enerated method stub 
     int filesize = 1022386; 
     int bytesRead; 
     int currentTot; 
     ServerSocket s = new ServerSocket(0); 
     int port = s.getLocalPort(); 
     ServerSocket serverSocket = new ServerSocket(15123); 
     while (true) { 
      Socket socket = serverSocket.accept(); 
      byte[] bytearray = new byte[filesize]; 
      InputStream is = socket.getInputStream(); 
      File copyFileName = new File("C:/Users/Username/Desktop/Output_file.txt"); 
      FileOutputStream fos = new FileOutputStream(copyFileName); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(bytearray, 0, bytearray.length); 
      currentTot = bytesRead; 
      do { 
       bytesRead = is.read(bytearray, currentTot, 
         (bytearray.length - currentTot)); 
       if (bytesRead >= 0) 
        currentTot += bytesRead; 
      } while (bytesRead > -1); 
      bos.write(bytearray, 0, currentTot); 
      bos.flush(); 
      bos.close(); 
      socket.close(); 
     } 
    } 
} 

programme client:

package SocketProgramming.copy; 

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class ClientSendFile { 
    public static void main(String[] args) throws UnknownHostException, 
      IOException { 
     // final String FILE_NAME="C:/Users/Username/Desktop/Input_file.txt"; 
     final String FILE_NAME = "C:/Users/Username/Desktop/Input_file.txt"; 
     ServerSocket s = new ServerSocket(0); 
     int port = s.getLocalPort(); 
     Socket socket = new Socket(InetAddress.getLocalHost(), 15123); 
     System.out.println("Accepted connection : " + socket); 
     File transferFile = new File(FILE_NAME); 
     byte[] bytearray = new byte[(int) transferFile.length()]; 
     FileInputStream fin = new FileInputStream(transferFile); 
     BufferedInputStream bin = new BufferedInputStream(fin); 
     bin.read(bytearray, 0, bytearray.length); 
     OutputStream os = socket.getOutputStream(); 
     System.out.println("Sending Files..."); 

     os.write(bytearray, 0, bytearray.length); 

     BufferedReader r = new BufferedReader(new FileReader(FILE_NAME)); 
     String as = "", line = null; 
     while ((line = r.readLine()) != null) { 
      as += line + "\n"; 
      // as += line; 

     } 
     System.out.print("Input File contains following data: " + as); 
     os.flush(); 
     fin.close(); 
     bin.close(); 
     os.close(); 
     socket.close(); 

     System.out.println("File transfer complete"); 
    } 
} 
+2

S'il vous plaît ne pas poster votre réponse plusieurs fois! Vous pouvez appuyer sur le bouton d'édition en dessous de votre réponse afin de l'améliorer. – honk

+0

Ajoutez également quelques explications pour votre code. –

0

c'est cl Code ient

première exécution du programme serveur puis sur un autre cmd exécuter le programme client

import java.io.*; 
import java.net.*; 

public class frmclient 
{ 
public static void main(String args[])throws Exception 
{ 

    try 
     { 
      DataInputStream d=new DataInputStream(System.in); 
      System.out.print("\n1.fact\n2.Sum of digit\nEnter ur choice:"); 

      int ch=Integer.parseInt(d.readLine()); 
      System.out.print("\nEnter number:"); 
      int num=Integer.parseInt(d.readLine()); 

      Socket s=new Socket("localhost",1024); 

      PrintStream ps=new PrintStream(s.getOutputStream()); 
      ps.println(ch+""); 
      ps.println(num+""); 

      DataInputStream dis=new DataInputStream(s.getInputStream()); 
      String response=dis.readLine(); 
       System.out.print("Answer:"+response); 


       s.close(); 
     } 
     catch(Exception ex) 
     { 

     } 
} 


} 

c'est le code côté sever

import java.io.*; 
import java.net.*; 
public class frmserver { 

    public static void main(String args[])throws Exception 
    { 

try 
    { 

    ServerSocket ss=new ServerSocket(1024); 
     System.out.print("\nWaiting for client....."); 
     Socket s=ss.accept(); 
     System.out.print("\nConnected"); 

     DataInputStream d=new DataInputStream(s.getInputStream()); 

     int ch=Integer.parseInt(d.readLine()); 
     int num=Integer.parseInt(d.readLine()); 
     int result=0; 

     PrintStream ps=new PrintStream(s.getOutputStream()); 
     switch(ch) 
     { 
      case 1:result=fact(num); 
       ps.println(result); 
        break; 
      case 2:result=sum(num); 
       ps.println(result); 
        break; 
     } 

      ss.close(); 
      s.close(); 
    } 
catch(Exception ex) 
{ 

} 
    } 

    public static int fact(int n) 
    { 
    int ans=1; 
    for(int i=n;i>0;i--) 
    { 
     ans=ans*i; 
    } 
    return ans; 
    } 
    public static int sum(int n) 
    { 
    String str=n+""; 
    int ans=0; 
    for(int i=0;i<str.length();i++) 
    { 
     int tmp=Integer.parseInt(str.charAt(i)+""); 
     ans=ans+tmp; 
    } 
    return ans; 
    } 
} 
-1
import java.io.*; 
import java.net.*; 
class serversvi1 
{ 
    public static void main(String svi[]) throws IOException 
    { 
    try 
    { 
     ServerSocket servsock=new ServerSocket(5510); 
     DataInputStream dis=new DataInputStream(System.in); 

     System.out.println("enter the file name"); 

     String fil=dis.readLine(); 
     System.out.println(fil+" :is file transfer"); 

     File myfile=new File(fil); 
     while(true) 
     { 
     Socket sock=servsock.accept(); 
     byte[] mybytearray=new byte[(int)myfile.length()]; 

     BufferedInputStream bis=new BufferedInputStream(new FileInputStream(myfile)); 

     bis.read(mybytearray,0,mybytearray.length); 

     OutputStream os=sock.getOutputStream(); 
     os.write(mybytearray,0,mybytearray.length); 
     os.flush(); 

     sock.close(); 
     } 
    } 
    catch(Exception saranvi) 
    { 
     System.out.print(saranvi); 
    } 
    } 
} 


import java.io.*; 
import java.net.*; 

class clientsvi1 
{ 
    public static void main(String svi[])throws IOException 
    { 
    try 
    { 
     Socket sock=new Socket("localhost",5510); 
     byte[] bytearray=new byte[1024]; 

     InputStream is=sock.getInputStream(); 
     DataInputStream dis=new DataInputStream(System.in); 
     System.out.println("enter the file name"); 

     String fil=dis.readLine(); 
     FileOutputStream fos=new FileOutputStream(fil); 
     BufferedOutputStream bos=new BufferedOutputStream(fos); 
     int bytesread=is.read(bytearray,0,bytearray.length); 
     bos.write(bytearray,0,bytesread); 
     System.out.println("out.txt file is received"); 
     bos.close(); 
     sock.close(); 
    } 
    catch(Exception SVI) 
    { 
     System.out.print(SVI); 
    } 
    } 
} 
+2

Pouvez-vous expliquer quoi que ce soit sur ce code? Cela n'aidera personne qui veut comprendre ce qui se passe, ou pourquoi le PO avait des problèmes de connexion. –

+0

Veuillez ajouter quelques explications. Votre réponse est actuellement signalée comme "de mauvaise qualité" et pourrait éventuellement être supprimée. –