Haxe server socket stops and does not recive messages from client after connecting?

67 Views Asked by At

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.

1

There are 1 best solutions below

7
Alexander Gordeyko On

I do it like this:

socket.input.readByte();

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