2017-09-17 16 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()を待っているためです。

関連する問題