2014-01-08 1 views
0

액터를 만든 다음 기본 입력을 읽는 프로그램이 있습니다. 나는 그것이 "법"방법에 작동하는 기본 배우을 형질에 folowing 작성하는 경우 :스칼라 ObjectInputStream 프로그램이 자동으로 작동하지 않습니다.

trait SocketActor extends Actor{ 


protected def sock:Socket 


protected val in:BufferedReader=new BufferedReader(new InputStreamReader(this.sock.getInputStream())) 
protected val out:PrintWriter= new PrintWriter(this.sock.getOutputStream(), true) 

def act(){ 
    println("This get to be executed") 
} 

내가 쓰는 경우가 행동 방법

trait SocketActor extends Actor{ 


protected def sock:Socket 


protected val in:ObjectInputStream=new ObjectInputStream(this.sock.getInputStream()) 
protected val out:ObjectOutputStream = new ObjectOutputStream (this.sock.getOutputStream()) 
def act(){ 
    println("This doesn't get to be executed") 
} 

을 실행하지 않습니다 다음

import java.net._ 
import java.io._ 
import scala.io._ 
import game.io._ 
class PlayerActor(protected val sock:Socket) extends { 

} with SocketActor 
object TabuClient{ 
    def main(args:Array[String]){ 
    try{ 
     println("Always exected on both cases") 
     val port=1337 
     val s = new Socket(InetAddress.getByName("localhost"), port) 

     val a=new PlayerActor(s) 
     a.start() 

     for (line <- io.Source.stdin.getLines){ 
      a.sendMessage(line) 
     } 
     s.close() 
    } 
    catch{ 
     case e:Throwable=>{ 
      e.printStackTrace() 
     } 

    } 
} 

이 두 가지 방법이 컴파일하지만, 두 번째는 기본적으로 던지는 예외

0123을하지 않고 배우의 시작 후 실패 배우의 생성은 다음과 같이 다시 시작할 수 있습니다 하여 객체 입력 스트림에 다음을 수행는

답변

0

는 단지 inputStream에 있다면, 재미 충분히 게으른 필요하지 않았다 그것을 해결

trait SocketActor extends Actor{ 


protected def sock:Socket 


protected lazy val in:ObjectInputStream=new ObjectInputStream(this.sock.getInputStream()) 
protected lazy val out:ObjectOutputStream = new ObjectOutputStream (this.sock.getOutputStream()) 
def act(){ 
    println("This doesn't get to be executed") 
} 
관련 문제