2017-09-17 27 views
2

저는 소켓에서 초보자이고 간단한 응용 프로그램을 작성 중이에요. Server.hx :Neko 서버, Neko/OpenFL 클라이언트 : std @ socket_read 예외

package; 

import neko.Lib; 
import sys.net.Host; 
import sys.net.Socket; 

class Main 
{ 

    static function main() 
    { 
     var s:Socket = new Socket(); 
     s.bind(new Host("localhost"), 5000); 
     s.listen(1); 
     trace("Server started"); 
     while (true) 
     { 
      var c:Socket; 
      var data:String; 
      c = s.accept(); 
      trace("Accepted peer: " + c.peer().host.ip); 
      c.write("Hi"); 

      while (true) 
      { 
       c.waitForRead(); 
       data = c.input.readLine(); 
       if (data.charAt(0) == "M") 
        trace(data.split(":")[1]); 
       else if (data.charAt(0) == "Q") 
       { 
        c.close(); 
        break; 
       } 
       else 
       { 
        trace("ERROR! CORRUPTED DATA"); 
        c.close(); 
        break; 
       } 
      } 
     } 
    } 

} 

Client.hx :

import openfl.display.Sprite; 
import openfl.Lib; 
import sys.net.Host; 
import sys.net.Socket; 

class Main extends Sprite 
{ 

    public function new() 
    { 
     super(); 

     var s:Socket = new Socket(); 
     var data:String; 
     s.connect(new Host("localhost"), 5000); 
      //s.waitForRead(); 
      //data = s.input.readLine(); 
      //trace(data); 

      s.write("M:Test message"); 
      s.write("Q"); 
      s.close(); 
    } 

} 

나는 서버를 실행하면, 그것은 잘 작동하지만 클라이언트를 통해 연결할 때, 그것은 클라이언트의 IP를 출력하고이를 던졌습니다 예외 std @ socket_read. openFL이 (Socket.waitForRead에 선언 된 것과 같은 오래 지속 루프를 지원하지 않는 것 때문에 내가 처리 "안녕"댓글을 달았습니다

data = c.input.readLine(); 

PS : 또한이 예외가 코드 줄에서 발생 된 것을 말한다) 그것을 컴파일하면 응용 프로그램이 응답을 멈 춥니 다. 또한 문제를 해결할 방법을 모르지만, 먼저 std @ socket_read 예외를 없애기를 원합니다.

+0

haxe 및 neko의 어떤 버전을 사용하고 있습니까? 서버에서'Test messageQ'를 성공적으로받은 후 (예민한)'Uncaught exception - Eof' 오류가 발생했습니다. –

+0

그건 그렇고,'Eof' 에러와 여러분이 경험 한 블로킹은 교환 된 모든 메시지의 끝에서 개행 문자가 누락되어서 발생합니다 : 에러는 서버가'Q' 명령을 확인하지 못해 발생했습니다; 블로킹은 개행이나 EOF에 도달 할 때까지'c.input.readLine()'블로킹 때문에 발생했습니다. –

답변

2

읽은 오류와 사용자가 경험 한 차단은 모두 끝에 줄 바꿈이 없기 때문에 발생합니다 교환 된 메시지.

오류는 줄 바꿈 부족으로 인해 서버가 Q 명령을 확인하지 못하기 때문에 발생합니다.

블로킹은 줄 바꿈 또는 EOF에 도달 할 때까지 (영원히) c.input.readLine() 대기로 인해 발생합니다.