2010-08-12 71 views
2

我是新的斯卡拉世界,所以請原諒我的小問題。 :)我只想打開一個套接字到一個端口,並接收消息。 如果我收到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

如果這段代碼真的是你正在使用的代碼,它有一個嚴重的問題:它使用來自靜態初始化器內部的線程。

這裏:

object HelloWorld extends { 

擴展是什麼?

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

無主的方法,所以其他的一切都是內部構造函數對象HelloWorld。基本上,這意味着使用線程(包括演員)的一切都不可靠。把這些東西放在主要方法中。

+0

有時你沒有看到樹木的森林。這是問題所在。非常感謝,我只是愚蠢的。 – evildead 2010-08-12 22:10:09

1

我不熟悉的netcat的,但它是可能的,它只是不打印"HALLO"響應,因爲它的方式編碼的netcat的不能理解(即Java的序列化格式)?如果您不將輸出流封裝在ObjectOutputStream中,它會工作嗎?