2010-01-29 2 views
18

Sto scrivendo il mio primo programma client/server Java che ha appena stabilisce una connessione con il server invia una frase e il server invia la frase di nuovo tutto maiuscolo. Questo è in realtà un esempio appena uscito dal libro, e funziona bene e bene quando sto eseguendo il client e il server sulla stessa macchina e usando localhost per l'indirizzo del server. Ma quando inserisco il programma client su un altro computer, esso va in timeout e non crea mai una connessione con il server. Non sono sicuro del motivo per cui è così e del suo tipo di zoppo che crea il tuo primo client/server e non è in grado di usarlo su due macchine diverse. Ecco il codice del client:semplice Java Client/Server programma

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(); 
    } 
} 

Ecco il codice del server:

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); 
     } 
    } 
} 

L'unica cosa a cambiare quando l'eseguo su due macchine diverse è il programma client fa la sua presa con l'indirizzo IP della macchina con il programma server (che ho ricevuto da whatismyipaddress.com). Grazie mille per qualsiasi aiuto.

Aggiornamento: Sono davvero in un campus e sembra che la sua probabilmente non avermi permesso di usare quella porta casuale. Qualche suggerimento su come scoprire quale porta posso usare e o su una porta che è più che probabile?

+1

ed è possibile connettersi al server tramite questo indirizzo IP altrimenti? (Usando ping/telnet/traceroute/etc.) – McDowell

+0

Prima di provare a eseguire il debug del programma, provate e assicuratevi di poter eseguire prima il ping dell'altro computer. In questo modo sai che la rete non è la colpa. –

+0

Ho provato il ping e ha funzionato. – Anton

risposta

8

È probabilmente un problema di firewall. Assicurati di portare in porto la porta a cui desideri connetterti sul lato server. localhost mappa direttamente su un ip e passa anche attraverso lo stack di rete. Stai modificando del testo nel tuo codice ma il modo in cui il tuo programma funziona è fondamentalmente lo stesso.

+0

provare la connessione al server con telnet da un computer client. Se ricevi "connessione rifiutata" o timeout, questo è un problema con il firewall –

+1

Se sei a scuola, quasi sicuramente hai un router. Ping non aiuterà molto; verifica che la macchina sia raggiungibile, ma non se la tua porta è aperta. Potresti provare a usare il tuo browser per connetterti alla macchina remota, dovresti ottenere qualcosa come "GET/HTTP 1.1". Oppure potresti provare qualcosa come il ricciolo. – TMN

1

Se avete ottenuto il vostro indirizzo IP da un sito web esterno (http://whatismyipaddress.com/), avete il vostro indirizzo IP esterno. Se il tuo server si trova sulla stessa rete locale, potrebbe essere necessario un indirizzo IP interno. Local IP addresses sembrano 10.X.X.X, 172.X.X.X o 192.168.X.X.

provare i suggerimenti su this page per trovare ciò che la vostra macchina pensa il suo indirizzo IP è.

+0

(Si noti che non tutti gli indirizzi 172.X.X.X sono locali.) –

+0

L'ho ricevuto da ipconfig e lo stesso è stato. – Anton

1

Invece di utilizzare l'indirizzo IP dal whatismyipaddress.com, che cosa se si ottiene l'indirizzo IP direttamente dalla macchina e collega che nel? whatismyipaddress.com ti darà l'indirizzo del tuo router (presumo che tu sia su una rete domestica). Non credo che il port forwarding funzionerà poiché la tua richiesta arriverà dalla rete, non all'esterno.

+0

Ho fatto anche ipconfig e ha fornito lo stesso indirizzo di whatismyipaddress.com – Anton

+0

Sei in una rete di campus o qualcosa del genere? Possono avere i loro switch/router configurati per bloccare determinate porte, anche dall'interno della rete. Se è possibile eseguire il ping sull'altro computer mentre questo non funziona, tale porta potrebbe essere bloccata. – Neal

+0

Sì, sono in un campus Immagino che dovrei provare con la porta 80 e vedere se ho fortuna? – Anton

3

V'è un concetto fondamentale di routing IP: È necessario disporre di un indirizzo IP univoco, se si desidera che la macchina di essere raggiungibile via Internet. Questo è chiamato "Indirizzo IP pubblico". "www.whatismyipaddress.com" ti darà questo. Se il tuo server è dietro qualche gateway predefinito, i pacchetti IP ti raggiungeranno tramite quel router. Non puoi essere raggiunto tramite il tuo indirizzo IP privato dal mondo esterno. Dovresti notare che gli indirizzi IP privati ​​di client e server possono essere uguali se i loro gateway predefiniti corrispondenti hanno indirizzi diversi (ecco perché IPv4 è ancora in vigore) Immagino tu stia provando a fare ping dal tuo indirizzo privato del tuo client a l'indirizzo IP pubblico del server (fornito da whatismyipaddress.com). Questo non è fattibile. Per raggiungere questo obiettivo è necessaria una mappatura da privato a pubblico, un processo chiamato Network Address Translation o NAT in breve. Questo è configurato in Firewall o Router. È possibile creare la propria rete privata (ad esempio tramite wifi). In questo caso, poiché il tuo client e il tuo server si troveranno sulla stessa rete logica, non sarà necessaria alcuna conversione da privato a indirizzo pubblico e quindi potrai comunicare usando solo i tuoi indirizzi IP privati.

0

L'uscita non è chiusa ... chiudere lo stream in modo che la risposta torni al client di test. Spero che questo aiuti.

0

è possibile ottenere l'IP di quel computer che esegue il programma server dall'elenco DHCP nel router a cui si è connessi.

+0

Puoi riformulare questa risposta per chiarirla? Non penso che quello che volevi dire sia molto chiaro. – skrrgwasme

+0

intendevo invece scrivere 'Socket clientSocket = new Socket (" localhost ", 6789);' localhost significa lo stesso computer in modo da trovare l'IP del computer su cui è in esecuzione il server. se il router viene utilizzato in questo caso, può aprire la pagina Web del router per trovare l'elenco DHCP che mostra i dispositivi collegati al router con un IP per ciascun dispositivo. – user3417593

0

mio cerco di fare il programma client socket

server legge il file e stamparlo per consolare e lo copia del file di output

Programma Server:

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(); 
     } 
    } 
} 

programma 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

Si prega di non pubblicare la tua risposta più volte! Puoi premere il pulsante di modifica sotto la tua risposta per migliorarla. – honk

+0

Aggiungete anche alcune spiegazioni per il vostro codice. –

0

questo è cl iente codice

prima esecuzione il programma server poi su un altro cmd eseguire programma 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) 
     { 

     } 
} 


} 

questo è il codice lato server

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

Puoi spiegare qualcosa su questo codice? Non aiuterà chi vuole capire cosa sta succedendo, o perché l'OP sta avendo problemi di connessione. –

+0

Per favore aggiungi qualche spiegazione. La tua risposta è attualmente contrassegnata come "di bassa qualità" e potrebbe eventualmente essere rimossa. –