Receiving multiple messages on same socket

This commit is contained in:
Crom (Thibaut CHARLES) 2015-04-21 22:47:54 +02:00
parent fdb3b56623
commit 20fbc943ce
2 changed files with 25 additions and 24 deletions

View File

@ -13,8 +13,10 @@ void main() {
sock.connect(new InternetAddress("127.0.0.1", 8080)); sock.connect(new InternetAddress("127.0.0.1", 8080));
writeln("Connected"); writeln("Connected");
auto msg = `{"action":"bind","target":"testnpc"}`; sock.send(`{"action":"bind","target":"testnpc"}`.toUTF8);
sock.send(msg.toUTF8);
writeln("Sent"); writeln("Sent");
Thread.sleep(dur!"seconds"(1)); Thread.sleep(dur!"seconds"(1));
sock.send(`{"action":"getenv","target":"testnpc"}`.toUTF8);
writeln("Sent2");
Thread.sleep(dur!"seconds"(1));
} }

View File

@ -57,7 +57,7 @@ namespace CLRScript
debugFile = File.AppendText("nwnx4\\customlog.txt"); debugFile = File.AppendText("nwnx4\\customlog.txt");
Debug("====================================> Start"); Debug("====================================> Start");
sockBufferIn = new Queue<string>(); sockBufferIn = new Queue<Tuple<string,Socket>>();
sockClients = new Dictionary<string,Socket>(); sockClients = new Dictionary<string,Socket>();
SocketConfigure(); SocketConfigure();
@ -83,38 +83,37 @@ namespace CLRScript
sockServer.Bind(iep); sockServer.Bind(iep);
sockServer.Listen(10); sockServer.Listen(10);
sockThread = new Thread(new ThreadStart(SocketHandler)); sockServer.BeginAccept(new AsyncCallback(RequestHandler), null);
sockThread.Start();
}
void SocketHandler()
{
while(true){
Debug("Accepting");
sockServer.BeginAccept(new AsyncCallback(RequestHandler), null);
//Wait for EndAccept?
Thread.Sleep(1000);
}
} }
void RequestHandler(IAsyncResult state) void RequestHandler(IAsyncResult state)
{ {
Socket sockClient = sockServer.EndAccept(state); Socket sockClient = sockServer.EndAccept(state);
byte[] rawData = new byte[1024]; sockServer.BeginAccept(new AsyncCallback(RequestHandler), null);
sockClient.Receive(rawData, rawData.Length, 0); sockClient.Blocking = true;
while (sockClient.Connected) {
byte[] rawData = new byte[sockClient.Available];
if (sockClient.Available > 0) {
sockClient.Receive(rawData, rawData.Length, 0);
string data = Encoding.UTF8.GetString(rawData);
Debug("Queued "+data);
sockBufferIn.Enqueue(new Tuple<string,Socket>(data, sockClient));
}
else
Thread.Sleep(100);//TODO: Find another way than sleeping
}
string data = Encoding.UTF8.GetString(rawData);
Debug("Queued "+data);
sockBufferIn.Enqueue(data);
} }
Socket sockServer; Socket sockServer;
Thread sockThread; Queue<Tuple<string,Socket>> sockBufferIn;//Request & client
Queue<string> sockBufferIn;
//PNJ tag => Client socket Dictionary<string, Socket> sockClients;//PNJ tag => Client socket
Dictionary<string, Socket> sockClients;
private void Debug(string msg){ private void Debug(string msg){
debugFile.WriteLine(DateTime.Now.ToLongTimeString()+": "+msg); debugFile.WriteLine(DateTime.Now.ToLongTimeString()+": "+msg);