Receiving multiple messages on same socket
This commit is contained in:
		
							parent
							
								
									fdb3b56623
								
							
						
					
					
						commit
						20fbc943ce
					
				
					 2 changed files with 25 additions and 24 deletions
				
			
		| 
						 | 
					@ -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));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue