Scala сокет не может записать в выходной поток - PullRequest
3 голосов
/ 13 августа 2010

Я новичок в мире скала, так что извините за мой тривиальный вопрос.:) Я просто хочу открыть сокет для порта и песка и получать сообщения.Если я получаю HELO, я хочу отреагировать сообщением, но я не могу записать в сокет каким-либо образом.Я использовал nc для прослушивания входящих соединений:

nc -k -l 127.0.0.1 3333

Когда клиент подключен, я пишу

HELO

в netcat, но клиент не отправляет ответ.

Вот мой код scala:

package hello

import java.io._
import java.net.{ InetAddress, ServerSocket, Socket, SocketException }
import java.util.Random
import scala.actors.Actor
import scala.actors.Actor._

object HelloWorld extends {
    def main(args: Array[String]) {}
    val ia = InetAddress.getByName("localhost");
    val socket = new Socket(ia, 3333)
    val out = new ObjectOutputStream(
        new DataOutputStream(this.socket.getOutputStream))
    val in = new DataInputStream(socket.getInputStream())
    println("Starting client");
    var i = 0;
    /* The actor!
     * 
     */
    val myActor = actor {
        loop {
            receive {
                case s: String => {
                    if (s.startsWith("HELO")) {
                        println("DEBUG: RECEIVED HELO=>SENDING AUTH!")
                        this.out.writeUTF("HALLO")
                        this.out.flush();
                    } else {
                        println("received:" + s);
                    }
                }
                case _ => println("I have no idea what I just got.")
            }
        }
    }
    /*
     * Testing the actor!
     * 
     */
    myActor ! "foobar";
    while (!socket.isConnected()) {
        println("Not connected waiting")
        Thread.sleep(5000);
    }
    if (socket.isConnected()) {
        println("connected");
    }
    try {
        while (true) {
            i += 1;
            val x = in.readLine()

            myActor ! x;
            Thread.sleep(500);
        }

    } catch {
        case e: IOException =>
            e.printStackTrace()
    }
}

Прием работает просто отлично, и субъект реагирует на входящее сообщение, но запись никогда не завершается.Я просто что-то наблюдаю или мой код неверен для отправки в outputSteam.

Вот мой вывод из окна консоли:

Starting client
connected
received:foobar
DEBUG: RECEIVED HELO=>SENDING AUTH!

Ответы [ 2 ]

2 голосов
/ 13 августа 2010

Если этот код действительно является кодом, который вы используете, у него есть серьезная проблема: он использует потоки из статического инициализатора.

Здесь:

object HelloWorld extends {

Что расширяет?

def main(args: Array[String]) {}

Нет метода main, поэтому все остальное находится внутри конструктора объекта HelloWorld.По сути, это означает, что все, что использует потоки (включая актеров), ненадежно.Поместите этот материал в основной метод.

1 голос
/ 13 августа 2010

Я не знаком с netcat, но возможно ли, что он просто не печатает ответ "HALLO", потому что он закодирован так, что netcat не имеет смысла (т.е. формат сериализации Java)? Работает ли это, если вы не заключаете выходной поток в ObjectOutputStream?

...