代码之家  ›  专栏  ›  技术社区  ›  evildead

Scala套接字无法写入输出流

  •  3
  • evildead  · 技术社区  · 15 年前

    我是scala的新手,所以请原谅我的小问题。:)我只想打开一个端口的套接字并接收消息。 如果我收到一个HELO,我想用一条消息作出反应,但我不能以任何方式写入套接字。

    nc -k -l 127.0.0.1 3333
    

    当客户端连接时,我写

    HELO
    

    但是客户端没有发送应答。

    这是我的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()
        }
    }
    

    以下是控制台窗口的输出:

    Starting client
    connected
    received:foobar
    DEBUG: RECEIVED HELO=>SENDING AUTH!
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Daniel C. Sobral    15 年前

    如果此代码确实是您正在使用的代码,那么它就有一个严重的问题:它使用的是静态初始值设定项中的线程。

    object HelloWorld extends {
    

    什么?

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

    没有main方法,所以其他所有的东西都在对象的构造函数中 HelloWorld . 基本上,这意味着使用线程(包括参与者)的一切都是不可靠的。把这些东西放到main方法中。

        2
  •  1
  •   Aaron Novstrup    15 年前

    "HALLO" 响应,因为它的编码方式是netcat无法理解的(即Java的序列化格式)?如果不将输出流包装到 ObjectOutputStream ?

    推荐文章