2017-08-17 11 views
1

こんにちは、HaxeでThreadServerを作成しようとしています。私はこの言語が大好きです。数日前にC#とAS3が混在しています。Haxeタイプが見つかりません:クライアント

だから、問題は、私はなどをキックするためにそれらを後で例にアクセスするにはリストのクライアントを保存しようとすると、私はそれを必要ですが、それは、入力したが、それは、それをここにアクセスできるようにする必要があり、同じパッケージ内にありますない私に語りましたファイル名とエラーのコードです。

エラー:

var cl:Client = { id: num, cSocket:s }; 
var cData = new ClientData(cl); 
Main.clients.add(cData); 

Server.hx:

package; 

import neko.Lib; 
import sys.net.Socket; 
import neko.net.ThreadServer; 
import haxe.io.Bytes; 

typedef Client = 
{ 
    var id : Int; 
    var cSocket:Socket; 
} 

typedef Message = 
{ 
    var str : String; 
} 

class Server extends ThreadServer<Client, Message> 
{ 
    // create a Client 
    override function clientConnected(s : Socket) : Client 
    { 
     var num = Std.random(100); 
     Lib.println("client " + num + " is " + s.peer()); 

     var cl:Client = { id: num, cSocket:s }; 
     var cData = new ClientData(cl); 
     Main.clients.add(cData); 

     return cl; 
    } 

    override function clientDisconnected(c : Client) 
    { 
     Lib.println("client " + Std.string(c.id) + " disconnected"); 
    } 

    override function readClientMessage(c:Client, buf:Bytes, pos:Int, len:Int) 
    { 
     var complete = false; 
     var cpos = pos; 
     while (cpos < (pos+len) && !complete) 
     { 
      complete = (buf.get(cpos) == 0); 
      cpos++; 
     } 

     if (!complete) return null; 

     var msg:String = buf.getString(pos, cpos-pos); 
     return {msg: {str: msg}, bytes: cpos-pos}; 
    } 

    override function clientMessage(c : Client, msg : Message) 
    { 
     Lib.println(c.id + " got: " + msg.str); 
    } 
} 

ClientData.hx:

package; 

class ClientData 
{ 
    var client:Client; 

    public function new(c:Client) 
    { 
     this.client = c; 
    } 
} 

Main.hx:

package; 

class Main 
{ 
    public static var clients=new List<ClientData>(); 

    static function main() 
    { 
     var server = new Server(); 
     server.run("localhost", 5588); 
    } 
} 

助けてくれてありがとう!

答えて

4

ClientServer.hxという名前のファイル(モジュール)で定義されているので、そのファイルの外Server.Clientとして、それに対処する必要があります、また

var client:Server.Client; 

全て自身でファイルClient.hxに移動します。 manual

これについての詳細を:

The distinction of a module and its containing type of the same name is blurry by design. In fact, addressing haxe.ds.StringMap can be considered shorthand for haxe.ds.StringMap.StringMap.

...

If the module and type name are equal, the duplicate can be removed, leading to the haxe.ds.StringMap short version. However, knowing about the extended version helps with understanding how module sub-types are addressed.

+0

すっごいはちょうどそれがClient.hxするタイプを動かさなかったし、それが働いていた、この答えを愚かSRS感謝しています!素晴らしい、ちょうど新しい何かを学んだ:) – Reptic

+0

あなたは愚かではありません。 Haxeの言葉は(ここではよくあることですが)ここでは「最小の驚きの原則」(https://en.wikipedia.org/wiki/Principle_of_least_astonishment)に違反しています。 P.S.答えがあなたのために働いた場合は、[同意する](https://stackoverflow.com/help/someone-answers)してください。 – Thomas

+0

私はそれを受け入れるだろうちょうど簡単な質問を行うためにカップルの分を待つ必要があります大きなプロジェクトなどのためのThreadServerスケーラブルですか? – Reptic

関連する問題