您正在尝试在Haxe中创建一个ThreadServer。我喜欢这种语言,几天前刚刚进入它,这是C#和AS3之间的混合,我喜欢它们!
所以问题是,当我尝试将客户端存储在列表中以便稍后访问它们时,示例踢它等我需要它但是它告诉我类型未找到但是它在同一个包中它应该能够访问它在这里是带有文件名和错误的代码。
错误:
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);
}
}
感谢您的帮助!
答案 0 :(得分:4)
由于Client
是在名为Server.hx
的文件(模块)中定义的,因此您需要在该文件之外将其作为Server.Client
处理:
var client:Server.Client;
或者,将其全部移至文件Client.hx
。
manual中的更多相关内容:
模块的区别及其相同名称的包含类型在设计上是模糊的。事实上,解决haxe.ds.StringMap可以被认为是haxe.ds.StringMap.StringMap的缩写。
...
如果模块和类型名称相同,则可以删除副本,从而导致haxe.ds.StringMap简短版本。但是,了解扩展版有助于了解module sub-types的处理方式。