Scala y Java io y problema de enchufes

Estoy siguiendo un ejemplo de programación java net, y decidí escribir un cliente-servidor en java-scala respectivamente, aquí está el código scala:

import scala.actors.Actor
import scala.actors.Actor._

import java.io._
import java.net._

class EchoActor(private val sock: Socket,
    private val id: Int) extends Actor{

    def act(){
        try{
            val in = new BufferedReader(
                new InputStreamReader(sock.getInputStream()))

            val out = new PrintWriter(
                sock.getOutputStream(), true)

            out.println("Hello! press BYE to exit")
            var done = false
            while(!done){
                var str = in.readLine()
                if (str == null) done = true
                else{
                    println(str) // debug
                    out.println("Echo (" + id + "): " + str)
                    if (str.trim().equals("BYE")) done = true
                }
            }
            sock.close()
        }
        catch{
            case e => e printStackTrace
        }
    }
}


object Main{
    def main(args: Array[String]){
        try{
            var i = 1
            val s = new ServerSocket(8189)

            while(true){
                var inc = s.accept()
                println("Spawning " + i)
                var a = new EchoActor(inc, i)
                a.start()
                i += 1
            }
        }
        catch{
            case e => e printStackTrace
        }
    }
}

Y aquí está Java:

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


public class Client{
    public static void main(String[] args){

        try{
            Socket s = new Socket("127.0.0.1",8189);

            BufferedReader in = new BufferedReader(
                new InputStreamReader(System.in));

            PrintWriter out = new PrintWriter(
                s.getOutputStream(), true);

            BufferedReader socketIn = new BufferedReader(
                new InputStreamReader(s.getInputStream()));

            System.out.println("Enter: to exit");
            String resp;
            String st
            while(true){
                st = in.readLine();
                if(st.equals("exit") || st.equals("quit")) break;
                else{
                    out.println(st);
                    resp = socketIn.readLine();
                    System.out.println(resp);
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

La salida del servidor:

Spawning 1
s

s

l
l
scala

java

salida de java:

Enter: to exit
s
Hello! press BYE to exit

Echo (1): s
s
Echo (1):

Echo (1): s
l
Echo (1):
l
Echo (1): l
scala
Echo (1): l

Echo (1): scala
java
Echo (1):

Echo (1): java

Como puede ver, estoy recibiendo una Echo (1)respuesta vacía donde espero imprimir Echo (1)más la cadena que acabo de enviar, debe volver a escribir "Enter" para que la cadena se envíe previamente, así que ese es el problema, solo necesito una respuesta del servidor así solo una vez: no Echo (1): some stringtengo ideas, lo rastreé imprimiendo en la consola, pero no puedo entender qué está pasando.

Editar:

Resultado esperado del cliente:

...
s
Echo (1): s
java
Echo (1): java

En el resultado esperado, no tiene que volver a escribir enterpara obtener la respuesta del servidor.

La salida del servidor ya funciona como se esperaba.

Respuesta 1

Se está confundiendo porque está enviando "¡Hola! Presione BYE para salir" cuando el cliente se conecta por primera vez, pero el cliente no lee esta línea específicamente. Por lo tanto, lo está leyendo en el cliente cuando espera leer el mensaje de eco que envió, por lo que su cliente siempre está leyendo un eco detrás de lo que cree que está haciendo.

Solución: elimine el "¡Hola! Presione BYE para salir" del servidor o léalo cuando conecte el cliente por primera vez, antes de ingresar al bucle.

Respuesta: 2

Así que aquí está el escenario. Tengo una clase A, y quiero que algunos de sus métodos se comporten de manera diferente dependiendo de cómo se llame la clase. Lo que he hecho ahora es algo como esto: interfaz Interfaz {...

Estoy haciendo un programa para calcular rutas de costo mínimo, utilizando árboles de expansión mínima. Hice mi implementación en c ++, pero no pude hacer una interfaz gráfica para leer el archivo de entrada, así que decidí ...

¿Podría alguien explicar qué devuelve PersistenceUtil.isLoaded en el contexto de JPA e hibernar. Mi impresión fue que identifica si el valor está cargado y se puede acceder sin base de datos ...

De acuerdo con la documentación en SSLSocket: puede registrarse para recibir una notificación de evento de finalización del protocolo de enlace. ¿Por qué no te registras para esto? ¿El hecho de que SSLSocket ...