2017-08-17 7 views
1

Hallo ich versuche, einen ThreadServer in Haxe zu erstellen. Ich liebe diese Sprache, bin erst vor ein paar Tagen dazu gekommen, es ist eine Mischung aus C# und AS3, die ich beide liebe!Haxe Typ nicht gefunden: Client

Also das Problem ist, wenn ich versuche, die Clients in einer Liste zu speichern, um später darauf zugreifen zu können usw. Ich brauche es aber es sagt Typ nicht gefunden, aber es ist im selben Paket sollte es hier zugreifen können ist der Code mit den Dateinamen und dem Fehler.

Fehler:

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

Danke für die Hilfe!

Antwort

4

Da Client in einer Datei definiert ist (Modul) genannt Server.hx, müssen Sie es als Server.Client außerhalb dieser Datei adressieren:

var client:Server.Client; 

Alternativ kann in einer Datei bewegen Client.hx ganz von selbst.

Mehr dazu in der 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

Omg bin so dumm srs Dank für diese Antwort nur hat es die Art bewegt Client.hx und es funktionierte! genial, habe gerade etwas Neues gelernt :) – Reptic

+0

Du bist nicht dumm; Die Haxe-Sprache verstößt hier gegen das [Prinzip des geringsten Erstaunens] (https://en.wikipedia.org/wiki/Principle_of_least_astonishment) (wie es oft der Fall ist). P.S. Wenn die Antwort für Sie funktioniert hat, akzeptieren Sie sie bitte (https://stackoverflow.com/help/someone-answers). – Thomas

+0

Ich werde es akzeptieren müssen nur warten paar Minuten zu tun, dass nur eine kurze Frage ist der ThreadServer skalierbar für große Projekte usw.? – Reptic

Verwandte Themen