diff --git a/OnlineUserPool.csproj b/OnlineUserPool.csproj
index 55c0642..3084aa6 100644
--- a/OnlineUserPool.csproj
+++ b/OnlineUserPool.csproj
@@ -5,10 +5,6 @@
netcoreapp3.1
true
-
-
-
-
diff --git a/Services/TcpService.cs b/Services/TcpService.cs
index 5c94e75..516e36f 100644
--- a/Services/TcpService.cs
+++ b/Services/TcpService.cs
@@ -1,93 +1,198 @@
-using OnlineUserPool.Model;
+using NetCoreServer;
+using Newtonsoft.Json;
+using OnlineUserPool.Model;
using OnlineUserPool.Unility;
using Serilog;
-using SimpleTcp;
using System;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
-using System.Threading.Tasks;
namespace OnlineUserPool.Services
{
public class TcpService : IService
{
- private bool _stop = false;
- SimpleTcpServer socket;
- Action _action;
+ private PfTcpServer _server;
- public void RunServer(Action action)
+ public void Close()
{
- //throw new NotImplementedException();
-
- _action = action;
- //var ip = IPAddress.Parse("192.168.0.97");
- var b = IPAddress.Any;
- socket = new SimpleTcpServer($"{ IPAddress.Any }:11001");
- socket.Events.ClientConnected += Events_ClientConnected;
- socket.Events.ClientDisconnected += Events_ClientDisconnected;
- socket.Events.DataReceived += Events_DataReceived;
-
- Task.Run(() =>
- {
- socket.Start();
- });
+
}
- private void Events_DataReceived(object sender, SimpleTcp.DataReceivedEventArgs e)
+ public void RunServer(Action action, Action disconnected = null)
{
- var returnData = Encoding.UTF8.GetString(e.Data);
- Debug.WriteLine(returnData);
+ _server = new PfTcpServer(IPAddress.Any, ConfigHelp.TcpPort, (ip, model) => { action(ip, model, this); },
+ disconnected);
- foreach (var item in returnData.Split(new string[] { "}" }, StringSplitOptions.RemoveEmptyEntries))
- {
- var msg = Newtonsoft.Json.JsonConvert.DeserializeObject(item +"}");
- var ipEndPoint = IPEndPoint.Parse(e.IpPort);
- _action(ipEndPoint, msg, this);
- }
- }
-
- private void Events_ClientDisconnected(object sender, ClientDisconnectedEventArgs e)
- {
-
- }
-
- private void Events_ClientConnected(object sender, ClientConnectedEventArgs e)
- {
- Debug.WriteLine("有新客户端连接" + e.IpPort);
+ _server.Start();
}
public void Send(byte[] dgram, int bytes, IPEndPoint endPoint)
{
- if(dgram == null || !dgram.Any())
+ if (dgram == null || !dgram.Any())
{
return;
}
- foreach (var item in socket.GetClients())
+ var session = _server.FindSession(endPoint);
+ if (session is { IsConnected: true })
{
- //try
- //{
- if(socket.IsConnected(item) == false)
- {
- continue;
- }
- socket.Send(item, dgram);
- //}
- //catch(Exception e)
- //{
- // Log.Error($"{ item.ToString() }:{ e.Message }\r\n{ e.StackTrace }");
- //}
+ session.SendAsync(dgram);
}
}
- public void Close()
+ private class PfTcpServer : TcpServer
{
- _stop = true;
- socket.Dispose();
+ private Action _action;
+ private Action _disconnected;
+
+ public PfTcpServer(IPAddress address, int port, Action action,
+ Action disconnected = null) : base(address, port)
+ {
+ _action = action;
+ _disconnected = disconnected;
+ }
+
+ protected override TcpSession CreateSession()
+ {
+ return new PfTcpSession(this, _action);
+ }
+
+ protected override void OnError(SocketError error)
+ {
+ //base.OnError(error);
+ Debug.WriteLine(error);
+ }
+
+ public TcpSession FindSession(IPEndPoint ip)
+ {
+ try
+ {
+ var item = this.Sessions.Values.FirstOrDefault(t =>
+ t.Socket.Connected && t.Socket.RemoteEndPoint.ToString() == ip.ToString());
+ return item;
+ }
+ catch (Exception e)
+ {
+ Log.Error( $"Fail to FindSession:{e}");
+ return null;
+ }
+ }
+
+ protected override void OnDisconnected(TcpSession session)
+ {
+ var currentSession = (session as PfTcpSession);
+ if (currentSession?.IPEndPoint != null)
+ {
+ _disconnected?.Invoke(currentSession.IPEndPoint);
+ }
+
+ base.OnDisconnected(session);
+ }
+ }
+
+ private class PfTcpSession : TcpSession
+ {
+ Action _action;
+ public IPEndPoint IPEndPoint { get; private set; }
+
+ public PfTcpSession(TcpServer server, Action action) : base(server)
+ {
+ _action = action;
+ }
+
+ protected override void OnConnected()
+ {
+ base.OnConnected();
+ Debug.WriteLine("有新的Tcp连接");
+ IPEndPoint = IPEndPoint.Parse(this.Socket.RemoteEndPoint.ToString());
+ }
+
+ protected override void OnDisconnected()
+ {
+ base.OnDisconnected();
+ Debug.WriteLine("Tcp断开连接");
+ }
+
+ private readonly StringBuilder _dataBuffer = new StringBuilder();
+
+ protected override void OnReceived(byte[] buffer, long offset, long size)
+ {
+ var data = string.Empty;
+ try
+ {
+ data = Encoding.UTF8.GetString(buffer, (int)offset, (int)size);
+ foreach (var item in data)
+ {
+ this._dataBuffer.Append(item);
+ if (item != '}') continue;
+ Debug.WriteLine("收到消息:" + this._dataBuffer);
+
+ var msg = JsonConvert.DeserializeObject(this._dataBuffer.ToString());
+ var ipEndPoint = IPEndPoint.Parse(this.Socket.RemoteEndPoint.ToString());
+ switch (msg.CommandType)
+ {
+ case 1:
+ _action(ipEndPoint, JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 2:
+ _action(ipEndPoint, JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 3:
+ switch (msg.SubType)
+ {
+ case 0:
+ _action(ipEndPoint,
+ JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 1:
+ _action(ipEndPoint,
+ JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 2:
+ _action(ipEndPoint,
+ JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 3:
+ _action(ipEndPoint,
+ JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 4:
+ _action(ipEndPoint,
+ JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 5:
+ _action(ipEndPoint,
+ JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ case 6:
+ _action(ipEndPoint,
+ JsonConvert.DeserializeObject(this._dataBuffer.ToString()));
+ break;
+ }
+
+ break;
+ default:
+ _action(ipEndPoint, msg);
+ break;
+ }
+
+ this._dataBuffer.Clear();
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Error($"接受到的数据处理时出错:{data}\r\n{ex.Message}\r\n{ex.StackTrace}");
+ }
+ }
+
+ protected override void OnError(SocketError error)
+ {
+ //base.OnError(error);
+ Debug.WriteLine(error);
+ }
}
}
}
diff --git a/Services/TcpService1.cs b/Services/TcpService1.cs
deleted file mode 100644
index 375cc49..0000000
--- a/Services/TcpService1.cs
+++ /dev/null
@@ -1,213 +0,0 @@
-using NetCoreServer;
-using Newtonsoft.Json;
-using OnlineUserPool.Model;
-using OnlineUserPool.Unility;
-using Serilog;
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Net;
-using System.Net.Sockets;
-using System.Text;
-
-namespace OnlineUserPool.Services
-{
- public class TcpService1 : IService
- {
- private PfTcpServer _server;
-
- public void Close()
- {
- //throw new NotImplementedException();
- }
-
- public void RunServer(Action action, Action disconnected = null)
- {
- //throw new NotImplementedException();
- //_action = action;
- _server = new PfTcpServer(IPAddress.Any, ConfigHelp.TcpPort, (ip, model)=> {
- action(ip, model, this);
- }, disconnected);
- //_server.OptionNoDelay = true;
- _server.Start();
- }
-
- public void Send(byte[] dgram, int bytes, IPEndPoint endPoint)
- {
- if (dgram == null || !dgram.Any())
- {
- return;
- }
- //_server.Multicast(dgram);
- var session = _server.FindSession(endPoint);
- if(session != null && session.IsConnected)
- {
- session.SendAsync(dgram);
- }
- }
-
- class PfTcpServer : TcpServer
- {
- private Action _action;
- private Action _disconnected;
- //private System.Collections.Generic.Dictionary clients = new Dictionary();
- public PfTcpServer(IPAddress address, int port, Action action, Action disconnected = null) :base(address, port)
- {
- _action = action;
- _disconnected = disconnected;
- }
-
- protected override TcpSession CreateSession()
- {
- //return base.CreateSession()
- return new PfTcpSession(this, _action);
- }
-
- protected override void OnError(SocketError error)
- {
- //base.OnError(error);
- Debug.WriteLine(error);
- }
-
- public TcpSession FindSession(IPEndPoint ip)
- {
- var item = this.Sessions.Values.FirstOrDefault(t => t.Socket.RemoteEndPoint.ToString() == ip.ToString());
- return item;
- }
-
- protected override void OnDisconnected(TcpSession session)
- {
- //var bbb = this.Sessions.GetValueOrDefault(session.Id);
-
- var bbb = (session as PfTcpSession);
- if(bbb.IPEndPoint != null)
- {
- _disconnected?.Invoke(bbb.IPEndPoint);
- }
- base.OnDisconnected(session);
- }
- }
-
- class PfTcpSession : TcpSession
- {
- Action _action;
- public IPEndPoint IPEndPoint { get; private set; }
- public PfTcpSession(TcpServer server, Action action) : base(server) {
- _action = action;
-
- }
-
- protected override void OnConnected()
- {
- base.OnConnected();
- Debug.WriteLine("有新的Tcp连接");
-
- IPEndPoint = IPEndPoint.Parse(this.Socket.RemoteEndPoint.ToString());
- }
-
- protected override void OnDisconnected()
- {
- base.OnDisconnected();
- Debug.WriteLine("Tcp断开连接");
- }
- private string temp = "";
- protected override void OnReceived(byte[] buffer, long offset, long size)
- {
- //base.OnReceived(buffer, offset, size);
-
- //Debug.WriteLine(returnData);
- //Log.Information(returnData + "\r\n");
- string returnData = "";
- try
- {
- returnData = Encoding.UTF8.GetString(buffer, (int)offset, (int)size);
- //var msg = Newtonsoft.Json.JsonConvert.DeserializeObject(returnData);
- //var ipEndPoint = IPEndPoint.Parse(this.Socket.RemoteEndPoint.ToString());
- //_action(ipEndPoint, msg);
- foreach (var item in returnData)
- {
- if(item == '}')
- {
- temp += item;
- Debug.WriteLine("收到消息:"+temp);
- var msg = JsonConvert.DeserializeObject(temp);
- var ipEndPoint = IPEndPoint.Parse(this.Socket.RemoteEndPoint.ToString());
- if (msg.CommandType == 1)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- else if (msg.CommandType == 2)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- //else if(msg.CommandType == 3)
- //{
- // _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- //}
- else if (msg.CommandType == 3)
- {
- if (msg.SubType == 0)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- if (msg.SubType == 1)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- if (msg.SubType == 2)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- if (msg.SubType == 3)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
-
- if (msg.SubType == 4)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- if (msg.SubType == 5)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- if (msg.SubType == 6)
- {
- _action(ipEndPoint, JsonConvert.DeserializeObject(temp));
- }
- }
- else
- {
- _action(ipEndPoint, msg);
- }
- temp = "";
- }
- else
- {
- temp += item;
- }
- }
-
- //foreach (var item in returnData.Split(new string[] { "}" }, StringSplitOptions.RemoveEmptyEntries))
- //{
- // //if (string.IsNullOrWhiteSpace(item)) continue;
- // var msg = Newtonsoft.Json.JsonConvert.DeserializeObject(item + "}");
- // var ipEndPoint = IPEndPoint.Parse(this.Socket.RemoteEndPoint.ToString());
- // _action(ipEndPoint, msg);
- //}
- }
- catch (Exception ex)
- {
- Log.Error($"接受到的数据处理时出错:{ returnData }\r\n{ ex.Message }\r\n{ ex.StackTrace }");
- }
- }
-
- protected override void OnError(SocketError error)
- {
- //base.OnError(error);
- Debug.WriteLine(error);
- }
- }
- }
-}
diff --git a/ViewModels/MainWindowViewModel.cs b/ViewModels/MainWindowViewModel.cs
index d72889d..a927b6f 100644
--- a/ViewModels/MainWindowViewModel.cs
+++ b/ViewModels/MainWindowViewModel.cs
@@ -104,7 +104,7 @@ namespace OnlineUserPool.ViewModels
//mapRecordRankingHander = new MultiUserHandle();
Log.Information($"初始化连接,当前地址:{ IPAddress.Any }:{ConfigHelp.UdpPort}");
- new TcpService1().RunServer(ReceivedData, CientDisconnected);
+ new TcpService().RunServer(ReceivedData, CientDisconnected);
//var tet = new System.Collections.Concurrent.ConcurrentBag