2010-08-12 4 views
2

저는 스칼라 세계에 새로 등장 했으므로 사소한 질문에 변명의 여지가 있습니다. :) 나는 포트와 샌드에 소켓을 열고 메시지를 받기만을 원한다. HELO를받은 경우 메시지에 반응하고 싶지만 어떤 식 으로든 소켓에 쓸 수는 없습니다. 내가 들어오는 연결을 수신하는 NC를 사용 :스칼라 소켓이 출력 스트림에 쓸 수 없습니다.

클라이언트가 연결되어
nc -k -l 127.0.0.1 3333 

내가 netcat을에서

HELO 

을 쓸 수 있지만 클라이언트가 아무 대답도 보내지 않습니다.

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() 
    } 
} 

수신이 잘 작동하고, 배우가 수신 메시지에 반응하지만, 쓰기가 수행되지 않습니다 :

여기 내 스칼라 코드입니다. 방금 무언가를 감독하거나 출력 코드로 보내는 코드가 잘못되었습니다.

Heres는 콘솔 창에서 내 출력 :

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

답변

2

이 코드가 실제로 사용하는 코드 인 경우 심각한 문제가 있습니다. 정적 초기화 프로그램 내부의 스레드를 사용하고 있습니다. 여기

:

object HelloWorld extends { 

무엇을 확장? 생성자가 HelloWorld을 반대하는 내부의 다른

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

없음 주요 방법, 그래서 모든입니다. 기본적으로, 이는 스레드 (액터 포함)를 사용하는 모든 것이 신뢰할 수 없다는 것을 의미합니다. 이 물건들을 주요 방법 안에 넣어 라.

+0

때때로 나무에 대한 숲이 보이지 않습니다. 그것이 문제였습니다. 많은 고마워, 나는 단지 바보 같았다. – evildead

1

내가, netcat을 잘 알고 모르겠지만 그것이 방식으로 인코딩 된 때문에 그냥 "HALLO" 응답을 인쇄 아니에요 그것이 가능하다는 것을 netcat을 수 없어 Java의 직렬화 포맷과 같은 의미를 갖습니까? ObjectOutputStream에서 출력 스트림을 래핑하지 않으면 작동합니까?

관련 문제