2010-01-29 22 views
18

Estoy escribiendo mi primer programa cliente/servidor java que solo establece una conexión con el servidor le envía una oración y el servidor devuelve la oración en mayúsculas. Este es en realidad un ejemplo directamente del libro, y funciona bien y bien cuando estoy ejecutando el cliente y el servidor en la misma máquina y usando localhost para la dirección del servidor. Pero cuando pongo el programa cliente en una computadora diferente, se agota y nunca establece una conexión con el servidor. No estoy seguro de por qué esto es así y es una especie de cojera que lo convierte en su primer programa de cliente/servidor y que en realidad no puede usarlo en dos máquinas diferentes. Aquí está el código de cliente:Programa Simple Cliente/Servidor Java

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

Aquí está el código del servidor:

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

El único cambio cuando lo ejecuto en dos máquinas diferentes es el programa cliente hace su zócalo con la dirección IP de la máquina con el programa de servidor (que obtuve de whatismyipaddress.com). Muchas gracias por cualquier ayuda.

Actualización: Estoy en un campus y parece que probablemente no me permita usar ese puerto aleatorio. ¿Alguna sugerencia para averiguar qué puerto puedo usar y/o un puerto que es más que probable?

+1

Y se puede conectar con el servidor a través de esta dirección IP ¿de otra manera? (Usando ping/telnet/traceroute/etc.) – McDowell

+0

Antes de intentar depurar el programa, quizás intente y asegúrese de poder hacer ping a la otra computadora primero. De esa forma, usted sabe que la red no tiene la culpa. –

+0

Intenté hacer ping y funcionó. – Anton

Respuesta

8

Probablemente sea un problema de firewall. Asegúrese de reenviar el puerto al que desea conectarse en el lado del servidor. localhost asigna directamente a una ip y también se mueve a través de su pila de red. Está cambiando un texto en su código, pero la forma en que funciona su programa es básicamente la misma.

+0

intente probar la conexión a su servidor con telnet desde una máquina cliente. Si obtiene "conexión rechazada" o tiempo de espera, es un problema de firewall –

+1

Si está en la escuela, casi seguro que tiene un enrutador. Ping no ayudará mucho; verifica que la máquina es alcanzable, pero no si su puerto está abierto. Podría intentar usar su navegador para conectarse a la máquina remota, debería recuperar algo como "GET/HTTP 1.1". O podrías probar algo como curl. – TMN

1

Si obtuvo su dirección IP de un sitio web externo (http://whatismyipaddress.com/), tiene su dirección IP externa. Si su servidor está en la misma red local, es posible que necesite una dirección IP interna. Local IP addresses se parecen a 10.X.X.X, 172.X.X.X, o 192.168.X.X.

Pruebe las sugerencias sobre this page para encontrar lo que su máquina piensa que es su dirección de IP.

+0

(Tenga en cuenta que no todas las direcciones 172.X.X.X son locales.) –

+0

Lo recibí de ipconfig también fue que era lo mismo. – Anton

1

En lugar de usar la dirección IP de whatismyipaddress.com, ¿qué pasa si obtiene la dirección IP directamente de la máquina y la conecta? whatismyipaddress.com le dará la dirección de su enrutador (supongo que está en una red doméstica). No creo que el reenvío de puertos funcione, ya que su solicitud vendrá desde dentro de la red, no desde afuera.

+0

Hice ipconfig también y dio la misma dirección que whatismyipaddress.com – Anton

+0

¿Estás en una red de campus o algo así? Pueden tener sus conmutadores/enrutadores configurados para bloquear ciertos puertos, incluso desde dentro de la red. Si puede hacer ping a la otra máquina mientras esto no funciona, ese puerto puede estar bloqueado. – Neal

+0

Sí, estoy en un campus. Supongo que debería probarlo con el puerto 80 y ver si tengo algo de suerte. – Anton

3

Existe un concepto fundamental de enrutamiento IP: debe tener una dirección IP única si desea que su máquina sea accesible a través de Internet. Esto se llama una "Dirección IP pública". "www.whatismyipaddress.com" le dará esto. Si su servidor está detrás de una puerta de enlace predeterminada, los paquetes de IP llegarán a usted a través de ese enrutador. No puede ser contactado a través de su dirección IP privada del mundo exterior. Debe tener en cuenta que las direcciones IP privadas del cliente y del servidor pueden ser las mismas siempre que sus correspondientes puertas de enlace predeterminadas tengan direcciones diferentes (es por eso que IPv4 todavía está vigente) Supongo que está intentando hacer ping desde su dirección privada de su cliente la dirección IP pública del servidor (proporcionada por whatismyipaddress.com). Esto no es factible Para lograr esto, se requiere un mapeo de direcciones privadas a públicas, un proceso llamado Traducción de direcciones de red o NAT en pocas palabras. Esto está configurado en Firewall o Router. Puede crear su propia red privada (por ejemplo, a través de wifi). En este caso, dado que su cliente y servidor estarían en la misma red lógica, no se requeriría traducción de direcciones privadas a públicas y, por lo tanto, puede comunicarse solo con sus direcciones IP privadas.

0

Outstream no está cerrado ... cierre la secuencia para que la respuesta vuelva al cliente de prueba. Espero que esto ayude.

0

puede obtener la ip de esa computadora ejecuta el programa del servidor de la lista de DHCP en ese enrutador al que se conectó.

+0

¿Puedes volver a formular esta respuesta para aclararla? No creo que lo que quisiste decir esté muy claro. – skrrgwasme

+0

Quería decir en lugar de escribir 'Socket clientSocket = new Socket (" localhost ", 6789);' localhost significa la misma computadora, por lo que debe encontrar la IP de la computadora que ejecuta el servidor. si el enrutador se usó en este caso: entonces puede abrir la página web del enrutador para encontrar la lista DHCP que mostrará los dispositivos conectados al enrutador con una IP para cada dispositivo. – user3417593

0

Mi intento de hacer programa de socket de cliente

servidor lee el archivo e imprimirlo a la consola y lo copia en el archivo de salida

Programa

Servidor:

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

programa Cliente:

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

¡No publique su respuesta varias veces! Puede presionar el botón Editar debajo de su respuesta para mejorarlo. – honk

+0

También agregue algunas explicaciones para su código. –

0

esto es cl código

primera ejecución del programa servidor, entonces en otra ient CMD programa cliente ejecuta

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) 
     { 

     } 
} 


} 

este es el código de lado del servidor

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

¿Puedes explicar algo sobre este código? No ayudará a nadie que quiera entender lo que está pasando, o por qué el OP tenía problemas de conexión. –

+0

Por favor, agregue alguna explicación. Su respuesta actualmente está marcada como de "baja calidad" y podría ser eliminada. –