import unibase.io.PrintStream;
import unibase.io.InputStream;
import unibase.net.Socket;
import unibase.net.SocketAddress;
import unibase.net.ServerSocket;
import unibase.concurrent.Runnable;
import unibase.concurrent.Thread;

class Receiver implements Runnable {
    private ServerSocket server;
    public string received = "";

    public Receiver(ServerSocket server) {
        this.server = server;
    }

    public void run() {
        Socket client = this.server.accept();
        InputStream input = client.input();
        this.received = input.readLine();
        PrintStream output = client.output();
        output.println("ack");
        client.close();
    }
}

class SocketSend {
    static void main() {
        ServerSocket server = ServerSocket(0);
        Receiver receiver = Receiver(server);
        Thread worker = Thread("receiver", receiver);
        worker.start();
        Socket socket = Socket();
        socket.connect(SocketAddress("127.0.0.1", server.port()));
        PrintStream output = socket.output();
        output.println("ping 🌐");
        InputStream input = socket.input();
        string reply = input.readLine();
        socket.close();
        worker.join();
        server.close();
        print(receiver.received);
        print(reply);
    }
}
