123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Net;
- using System.Net.Sockets;
- using FunnyCommon.Remoting.Protocol;
- using FunnyCommon.Shared;
- namespace FunnyCommon.Remoting.Networking
- {
- public class Server : ServerBase
- {
- private readonly IPiGpoutManager _gpoutManager;
- public Server(IPiGpoutManager gpoutManager)
- {
- _gpoutManager = gpoutManager;
- }
- protected override void HandleClientOneByOne(Socket client)
- {
- using (var ns = new NetworkStream(client))
- {
- using (var br = new BinaryReader(ns))
- using (var bw = new BinaryWriter(ns))
- {
- Log?.WriteLine("Checking Protocol version...");
- if (Consts.Version != br.ReadByte())
- {
- Log?.WriteLine("Protocol version Not matched!");
- return;
- }
- Log?.WriteLine("Enter looping.");
- while (client.Connected)
- {
- ushort count = br.ReadByte();
- count += (ushort)(br.ReadByte() * 256);
- Log?.WriteLine($"Recv: {count} commands");
- var arrCommands = new Command[count];
- Log?.Write("Parsing:");
- for (var i = 0; i < count; i++)
- {
- arrCommands[i] = Command.ReadFromStream(ns);
- Log?.Write(".");
- }
- Log?.WriteLine("Success");
- var responses = new List<Response>(count);
- Log?.WriteLine("*** Begin execute ***");
- for (var i = 0; i < arrCommands.Length; i++)
- {
- var command = arrCommands[i];
- try
- {
- var r = command.Execute(_gpoutManager);
- responses.Add(r);
- Log?.WriteLine($"{i:00000} - {r}");
- }
- catch (Exception ex)
- {
- responses.Add(new Response { Success = false, Message = ex.Message });
- Log?.WriteLine("<ERROR>");
- Log?.WriteLine(ex.ToString());
- break;
- }
- }
- Log?.WriteLine("*** Finish execute ***");
- Log?.Write($"Writing response({responses.Count}):");
- bw.Write((byte)responses.Count);
- bw.Write((byte)(responses.Count >> 8));
- foreach (var response in responses)
- {
- var buf = response.ToBytes();
- bw.Write(buf);
- Log?.Write(buf.Length + ".");
- }
- Log?.WriteLine();
- Log?.WriteLine($"To be next loop...");
- }
- }
- }
- }
- }
- public abstract class ServerBase : IDisposable
- {
- private Socket _svr;
- public TextWriter Log { get; set; }
- public void Start(int port)
- {
- Stop();
- _svr = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- _svr.Bind(new IPEndPoint(IPAddress.Any, port));
- _svr.Listen(1);
- AsyncCallback accept = null;
- accept = ar =>
- {
- var cl = _svr.EndAccept(ar);
- Log?.WriteLine($"Accept from {cl.RemoteEndPoint}");
- try
- {
- HandleClientOneByOne(cl);
- }
- catch (Exception ex)
- {
- Log?.WriteLine(ex);
- }
- cl.Close();
- _svr.BeginAccept(accept, null);
- };
- _svr.BeginAccept(accept, null);
- }
- public void Stop()
- {
- _svr?.Close();
- }
- public void Dispose()
- {
- Stop();
- }
- protected abstract void HandleClientOneByOne(Socket client);
- }
- }
|