I have my server written in haxe using sys.net.Socket, and clients connect to server succesfully, however after starting a thread for client, it stops at the line where it should recive the message, and no matter what I send to server from client.
My server class:
package;
import sys.net.Host;
import sys.net.Socket;
import sys.io.File;
import haxe.xml.Access;
import sys.thread.Thread;
class Player {
public var socket:Socket;
public var name:String;
public var server:Server;
public var active:Bool;
public function new(sv:Server, skt:Socket) {
server = sv;
socket = skt;
name = '';
active = true;
}
public function toString():String {
var peer = socket.peer();
var pstr = Std.string(peer.host) + ':' + peer.port;
return (name == null || name == '') ? pstr : (name + '(' + pstr + ')');
}
public function send(text:String) {
try {
socket.output.writeString(text);
} catch (z:Dynamic) {
trace(z);
active = false;
}
}
}
class Server {
var socket:Socket;
var ip:String;
var port:Int;
var players:Array<Player> = [];
public function new() {
var config:Access = new Access(Xml.parse(File.getContent("config.xml")));
var netCfg = config.node.cfg.node.connection;
ip = netCfg.att.ip;
port = Std.parseInt(netCfg.att.port);
socket = new Socket();
socket.bind(new Host(ip), port);
trace("Starting server...");
socket.listen(4);
trace("Server started.");
accept();
}
public function handleClient(player:Player):Void {
trace("handle client thread brrr");
while (player.active) {
try {
var msg:String = player.socket.read();
trace(msg);
if (msg == "disconnect") {
break;
}
} catch (e:Dynamic) {
trace(e);
break;
}
trace(Std.string(player) + " disconnected");
players.remove(player);
try {
player.socket.shutdown(true, true);
player.socket.close();
} catch (e:Dynamic) {
}
}
}
public function accept():Void {
trace("Listening for connections on " + ip + ":" + port);
while (true) {
var client = socket.accept();
if (client != null) {
trace("A new client has connected [" + client.peer().host + "]");
var player = new Player(this, client);
players.push(player);
Thread.create(() -> handleClient(player));
}
}
}
public static function main() {
new Server();
}
}
My Client class:
package;
import haxe.io.Encoding;
import sys.net.Host;
import sys.net.Socket;
import sys.thread.Thread;
class Client
{
var socket:Socket;
public function new(ip:String, port:Int):Void
{
socket = new Socket();
socket.connect(new Host(ip), port);
Thread.create(() -> listen());
}
function listen():Void
{
while (true)
{
try
{
var msg:String = socket.input.readLine();
trace(msg);
}
catch (e:Dynamic)
{
trace("Connection lost. [" + e + "]");
}
}
}
public function send(data:String):Void
{
socket.output.writeString(data, Encoding.UTF8);
}
}
The thread of the server appears to just pause at the line of code when it's supposed to read data from socket, even after sending some data.
I do it like this:
And it works.
But besides the code, the cause of the problem may be in the target. What target are you using?
In any case, this looks like a bug in Haxe, which is worth reporting on github: https://github.com/HaxeFoundation/haxe/issues