web-dev-qa-db-fra.com

Programme client/serveur Java simple

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 cela fonctionne très bien lorsque j’exécute le client et le serveur sur le même ordinateur et que je utilise localhost pour l’adresse du serveur. Mais lorsque je mets le programme client sur un autre ordinateur, il expire et ne se connecte jamais au serveur. Je ne suis pas sûr de comprendre pourquoi et son genre de boiteux faisant de votre premier programme client/serveur et ne pouvant réellement l’utiliser sur deux machines différentes. Voici le code client:

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 lorsque je l'exécute sur deux machines différentes est que le programme client crée son socket avec l'adresse IP de la machine avec le programme serveur (que j'ai reçu de whatismyipaddress.com). Merci beaucoup pour toute aide.

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

20
Anton

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

8
Chris H

Il existe un concept fondamental de routage IP: vous devez disposer d'une adresse IP unique si vous souhaitez que votre machine soit accessible via Internet. Ceci s'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 parviendront via ce routeur. Vous ne pouvez pas être atteint via votre adresse IP privée du monde extérieur. Notez 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 actif) client à l'adresse IP publique du serveur (fournie par whatismyipaddress.com). Ce n'est pas faisable. Pour ce faire, un mappage d'adresse privée en adresse publique est requis, processus appelé traduction d'adresse réseau ou NAT en bref. Ceci est configuré dans le pare-feu ou le routeur . Vous pouvez créer votre propre réseau privé (par exemple via le wifi). Dans ce cas, étant donné que votre client et votre serveur se trouveraient sur le même réseau logique, aucune conversion d'adresse privée en adresse publique ne serait requise et vous pouvez donc communiquer en utilisant uniquement vos adresses IP privées.

3
Vinit Shandilya

Si vous avez obtenu votre adresse IP sur 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 aurez peut-être besoin d'une adresse IP interne. Les adresses IP locales ressemblent à 10.X.X.X, 172.X.X.X ou 192.168.X.X.

Essayez les suggestions de cette page pour trouver ce que votre machine pense de son adresse IP.

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 que vous 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, car votre demande proviendra du réseau, pas de l'extérieur. 

1
Neal

c'est le code client

lancez d'abord le programme serveur puis sur un autre programme client, exécutez cmd

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é serveur

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;
  }
}
0
Prakash Ekhande

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

0
user3417593

Mon essai de faire le programme de socket client

le serveur lit le fichier, l’imprime sur la console et le copie dans le fichier de sortie 

Programme serveur:

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");
    }
}
0
Shree

Outstream n'est pas fermé ... fermez le flux afin que la réponse revienne au client test .. .. J'espère que cela vous aidera.

0
Ravi raj