Cliente/servidor de comunicación Java

Esto está en mi cliente:

public static void logIn(String name, String pass) {
try {
    Socket s = new Socket("localhost", 9000);
    PrintStream out = new PrintStream(s.getOutputStream());
    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    out.print(name + "," + pass);
    out.flush();
    out.close();

    System.out.println(in.readLine());

    in.close();
    s.close();
}
catch(UnknownHostException exp)
{
    exp.printStackTrace();

}
catch(java.io.IOException exp)
{
    exp.printStackTrace();
}   
}

y esto lo tengo en mi servidor:

 public static void main(String[] args){
 boolean clientExists=false;
 ArrayList<User> users = new ArrayList<User>();
 users.add(new User("jmeno","heslo"));
 ServerSocket ss;
 try {
    ss = new ServerSocket(9000);
    while(true) {
                clientExists=false;
        Socket s = ss.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintStream out = new PrintStream(s.getOutputStream());
        String xmlpacket="";
                String pom;

                while ((pom = in.readLine())!=null){
                     xmlpacket+=pom;
                     xmlpacket+="\n";
                }

                for(User us: users)
                    {
                            if(us.isUserNameAndPasswordRight(login, passwd))
                            {
                                    out.print("user is connected");
                                    out.flush();
                                    clientExists=true;
                            }
                    }
                }
                if(clientExist != true)
              out.print("bad login");
        out.flush();
        out.close();
        in.close();
        s.close();
}
catch(java.io.IOException exp)
{
    System.out.println("chyba u socketu!");
}

}

¿Es posible trabajar así? No puedo hacer que esto funcione debido a una excepción en el lado del cliente cuando intento leer la respuesta del servidor.

Editar: Esto es stacktrace:

java.net.SocketException: socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at client.client.logIn(client.java:79)


    at client.GUI.GUI.jMenuItem1ActionPerformed(GUI.java:379)
    at client.GUI.GUI.access$5(GUI.java:367)
    at client.GUI.GUI$5.actionPerformed(GUI.java:151)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

preguntado el 03 de mayo de 12 a las 13:05

Envíe la excepción más stacktrace y resalte el método/línea ofensivo:

3 Respuestas

Hice varias cosas, así que da todo el código.

  • Colocó el lector almacenado en búfer más tarde, para posiblemente evitar el bloqueo.
  • Codificación agregada, por lo que no usa la codificación predeterminada del sistema operativo (cliente en un sistema operativo diferente).
  • Hizo println io imprimir.
  • Lavado automático.
  • Importante: no PrintStream sino PrintWriter.
  • Sin bucle en xmlpacket; ese fue el código para más tarde.

    public static void logIn(String name, String pass) {
    try {
        Socket s = new Socket("localhost", 9000);
        //PrintStream out = new PrintStream(s.getOutputStream(), true, "UTF-8");
        PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "UTF-8"), true);
        out.println(name + "," + pass);
        out.flush();
    
        BufferedReader in = new BufferedReader(new InputStreamReader(
                s.getInputStream(), "UTF-8"));
    
        System.out.println(in.readLine());
    
        out.close();
        in.close();
        s.close();
    } catch (UnknownHostException exp) {
        exp.printStackTrace();
    
    } catch (java.io.IOException exp) {
        exp.printStackTrace();
    }
    }
    
    
    public static void main(String[] args) {
    ArrayList<User> users = new ArrayList<User>();
    users.add(new User("jmeno", "heslo"));
    ServerSocket ss;
    try {
        ss = new ServerSocket(9000);
        while (true) {
            Socket s = ss.accept();
            System.out.println("Accept...");
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    s.getInputStream(), "UTF-8"));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "UTF-8"), true);
            String xmlpacket = "";
            String pom;
    
            pom = in.readLine();
            //while ((pom = in.readLine()) != null) {
                xmlpacket += pom;
                xmlpacket += "\n";
            //}
            int commaPos = xmlpacket.indexOf(',');
            int newlinePos = xmlpacket.indexOf('\n');
            String login = xmlpacket.substring(0, commaPos);
            String passwd = xmlpacket.substring(commaPos + 1, newlinePos);                        
    
            boolean clientExists = false;
            for (User us : users) {
                if (us.isUserNameAndPasswordRight(login, passwd)) {
                    out.println("user is connected");
                    clientExists = true;
                    break;
                }
            }
            if (!clientExists)
                out.println("bad login");
            out.close();
            in.close();
            s.close();
        }
    } catch (java.io.IOException exp) {
        System.out.println("chyba u socketu!");
    }
    }
    

contestado el 03 de mayo de 12 a las 14:05

Prueba a quitarte el out.close() y mira lo que pasa. Yo creo que cerrar el OutputStream también cierra el socket relacionado. No querrás hacer eso hasta que hayas leído la respuesta.

Noticias: para que quede claro, me refiero a quitar (o mover hasta el final) el out.close() en el cliente, no en el servidor.

contestado el 03 de mayo de 12 a las 13:05

Esto es lo que pienso también, pero cuando lo agrego al final, el cliente no responde y el servidor no recibe un mensaje con el nombre de usuario y la contraseña. - Libor Zapletal

@Bibo: si ha realizado alguna depuración, ¡debería informarnos al respecto! Si no nos proporciona toda la información que tiene, simplemente estamos perdiendo el tiempo. - Martín James

@MartinJames Conozco la sensación, por lo general alguien llega antes que yo :-) - sparc_spread

@MartinJames Lo siento, probé más cambios en mi código y cuando escribo 'out.close' para finalizar, tengo un problema con la lectura en el lado del servidor mientras. Simplemente lee la cadena para el penúltimo y luego termina y no continúa en el código. - Libor Zapletal

'out.print(nombre + "," + contraseña);' no parece emitir un terminador de línea, por lo que 'readLine()' en su cliente no volverá. Pruebe 'println' y deshágase del bodge cercano.

contestado el 03 de mayo de 12 a las 13:05

Todavía no puedo pasar mientras. Leo todos los datos con ese println pero no continúo en el código. - Libor Zapletal

Parece que in.ReadLine() todavía está esperando más líneas para leer o no sé por qué en el debbuger estoy en while y luego cuando debería ir a la siguiente línea de código pero la línea verde en el debbuger falla (uso eclipse ) y la interfaz gráfica de usuario en el cliente no responde. - Libor Zapletal

El servidor tiene el mismo problema: 'out.print("el usuario está conectado");' - sin terminador tx. - Martín James

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.