浏览代码

1.修改注册配置

2.修改http服务器配置
master
SmallChi(Koike) 4 年前
父节点
当前提交
ba6b0c34e2
共有 5 个文件被更改,包括 68 次插入22 次删除
  1. +5
    -0
      src/JT1078.Gateway/Configurations/JT1078Configuration.cs
  2. +1
    -3
      src/JT1078.Gateway/JT1078GatewayExtensions.cs
  3. +44
    -19
      src/JT1078.Gateway/JT1078HttpServer.cs
  4. +1
    -0
      src/JT1078.Gateway/JT1078UdpServer.cs
  5. +17
    -0
      src/JT1078.Gateway/Metadata/JT1078HttpContext.cs

+ 5
- 0
src/JT1078.Gateway/Configurations/JT1078Configuration.cs 查看文件

@@ -13,6 +13,11 @@ namespace JT1078.Gateway.Configurations
public int SoBacklog { get; set; } = 8192; public int SoBacklog { get; set; } = 8192;
public int MiniNumBufferSize { get; set; } = 8096; public int MiniNumBufferSize { get; set; } = 8096;
/// <summary> /// <summary>
/// http写超时
/// 默认5s检查一次
/// </summary>
public int HttpWriterIdleTimeSeconds { get; set; } = 5;
/// <summary>
/// Tcp读超时 /// Tcp读超时
/// 默认10分钟检查一次 /// 默认10分钟检查一次
/// </summary> /// </summary>


+ 1
- 3
src/JT1078.Gateway/JT1078GatewayExtensions.cs 查看文件

@@ -39,13 +39,13 @@ namespace JT1078.Gateway
public static IJT1078GatewayBuilder AddTcp(this IJT1078GatewayBuilder builder) public static IJT1078GatewayBuilder AddTcp(this IJT1078GatewayBuilder builder)
{ {
builder.JT1078Builder.Services.AddHostedService<JT1078TcpReceiveTimeoutJob>(); builder.JT1078Builder.Services.AddHostedService<JT1078TcpReceiveTimeoutJob>();
builder.JT1078Builder.Services.AddHostedService<JT1078UdpReceiveTimeoutJob>();
builder.JT1078Builder.Services.AddHostedService<JT1078TcpServer>(); builder.JT1078Builder.Services.AddHostedService<JT1078TcpServer>();
return builder; return builder;
} }


public static IJT1078GatewayBuilder AddUdp(this IJT1078GatewayBuilder builder) public static IJT1078GatewayBuilder AddUdp(this IJT1078GatewayBuilder builder)
{ {
builder.JT1078Builder.Services.AddHostedService<JT1078UdpReceiveTimeoutJob>();
builder.JT1078Builder.Services.AddHostedService<JT1078UdpServer>(); builder.JT1078Builder.Services.AddHostedService<JT1078UdpServer>();
return builder; return builder;
} }
@@ -64,8 +64,6 @@ namespace JT1078.Gateway


public static IJT1078QueueGatewayBuilder AddQueue(this IJT1078GatewayBuilder builder) public static IJT1078QueueGatewayBuilder AddQueue(this IJT1078GatewayBuilder builder)
{ {
builder.JT1078Builder.Services.AddHostedService<JT1078TcpReceiveTimeoutJob>();
builder.JT1078Builder.Services.AddHostedService<JT1078UdpReceiveTimeoutJob>();
return new JT1078QueueGatewayBuilderDefault(builder.JT1078Builder); return new JT1078QueueGatewayBuilderDefault(builder.JT1078Builder);
} }




+ 44
- 19
src/JT1078.Gateway/JT1078HttpServer.cs 查看文件

@@ -10,6 +10,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Net.WebSockets; using System.Net.WebSockets;
using System.Security.Principal;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -57,9 +58,7 @@ namespace JT1078.Gateway
{ {
if (authorization.Authorization(context,out var principal)) if (authorization.Authorization(context,out var principal))
{ {
//new JT1078HttpContext(context, principal);
//todo:session manager
await ProcessRequestAsync(context);
await ProcessRequestAsync(context, principal);
} }
else else
{ {
@@ -76,7 +75,7 @@ namespace JT1078.Gateway
return Task.CompletedTask; return Task.CompletedTask;
} }


private async ValueTask ProcessRequestAsync(HttpListenerContext context)
private async ValueTask ProcessRequestAsync(HttpListenerContext context, IPrincipal principal)
{ {
if(context.Request.RawUrl.StartsWith("/favicon.ico")) if(context.Request.RawUrl.StartsWith("/favicon.ico"))
{ {
@@ -84,26 +83,36 @@ namespace JT1078.Gateway
} }
if (Logger.IsEnabled(LogLevel.Trace)) if (Logger.IsEnabled(LogLevel.Trace))
{ {
Logger.LogTrace($"[http RequestTraceIdentifier]:{context.Request.RequestTraceIdentifier.ToString()}");
Logger.LogTrace($"[http RequestTraceIdentifier]:{context.Request.RequestTraceIdentifier.ToString()}-{context.Request.RemoteEndPoint.ToString()}");
} }
string sim = context.Request.QueryString.Get("sim");
string channel = context.Request.QueryString.Get("channel");
if(string.IsNullOrEmpty(sim) || string.IsNullOrEmpty(channel))
{
await Http400(context);
return;
}
int.TryParse(channel, out int channelNo);
if (context.Request.IsWebSocketRequest) if (context.Request.IsWebSocketRequest)
{ {
HttpListenerWebSocketContext wsContext = await context.AcceptWebSocketAsync(null); HttpListenerWebSocketContext wsContext = await context.AcceptWebSocketAsync(null);
//todo:websocket context 管理
var jT1078HttpContext = new JT1078HttpContext(context, wsContext,principal);
jT1078HttpContext.Sim = sim;
jT1078HttpContext.ChannelNo = channelNo;
//todo: add session manager
await wsContext.WebSocket.SendAsync(Encoding.UTF8.GetBytes("hello,jt1078"), WebSocketMessageType.Text, true, CancellationToken.None); await wsContext.WebSocket.SendAsync(Encoding.UTF8.GetBytes("hello,jt1078"), WebSocketMessageType.Text, true, CancellationToken.None);
await Task.Factory.StartNew(async(state) => await Task.Factory.StartNew(async(state) =>
{ {
//https://www.bejson.com/httputil/websocket/ //https://www.bejson.com/httputil/websocket/
//ws://127.0.0.1:15555?token=22
var websocketContext = state as HttpListenerWebSocketContext;
while(websocketContext.WebSocket.State == WebSocketState.Open ||
websocketContext.WebSocket.State == WebSocketState.Connecting)
//ws://127.0.0.1:15555?token=22&sim=1221&channel=1
var websocketContext = state as JT1078HttpContext;
while(websocketContext.WebSocketContext.WebSocket.State == WebSocketState.Open ||
websocketContext.WebSocketContext.WebSocket.State == WebSocketState.Connecting)
{ {
var buffer = ArrayPool<byte>.Shared.Rent(256); var buffer = ArrayPool<byte>.Shared.Rent(256);
try try
{ {
WebSocketReceiveResult receiveResult = await websocketContext.WebSocket.ReceiveAsync(buffer, CancellationToken.None);
WebSocketReceiveResult receiveResult = await websocketContext.WebSocketContext.WebSocket.ReceiveAsync(buffer, CancellationToken.None);
if (receiveResult.EndOfMessage) if (receiveResult.EndOfMessage)
{ {
if (receiveResult.Count > 0) if (receiveResult.Count > 0)
@@ -113,7 +122,7 @@ namespace JT1078.Gateway
{ {
Logger.LogTrace($"[ws receive]:{Encoding.UTF8.GetString(data)}"); Logger.LogTrace($"[ws receive]:{Encoding.UTF8.GetString(data)}");
} }
await websocketContext.WebSocket.SendAsync(data, WebSocketMessageType.Text, true, CancellationToken.None);
await websocketContext.WebSocketContext.WebSocket.SendAsync(data, WebSocketMessageType.Text, true, CancellationToken.None);
} }
} }
} }
@@ -124,19 +133,24 @@ namespace JT1078.Gateway
} }
if (Logger.IsEnabled(LogLevel.Trace)) if (Logger.IsEnabled(LogLevel.Trace))
{ {
Logger.LogTrace($"[ws close]:{wsContext}");
Logger.LogTrace($"[ws close]:{websocketContext}");
} }
//todo:session close notice //todo:session close notice
await wsContext.WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal", CancellationToken.None);
}, wsContext);
await websocketContext.WebSocketContext.WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal", CancellationToken.None);
}, jT1078HttpContext);
} }
else else
{ {
var jT1078HttpContext = new JT1078HttpContext(context,principal);
jT1078HttpContext.Sim = sim;
jT1078HttpContext.ChannelNo = channelNo;

//todo:add session manager

//todo:set http chunk //todo:set http chunk

//todo:session close notice //todo:session close notice
//var body = await new StreamReader(context.Request.InputStream).ReadToEndAsync();
var options = context.Request.QueryString;
//var keys = options.AllKeys;

byte[] b = Encoding.UTF8.GetBytes("ack"); byte[] b = Encoding.UTF8.GetBytes("ack");
context.Response.StatusCode = 200; context.Response.StatusCode = 200;
context.Response.KeepAlive = true; context.Response.KeepAlive = true;
@@ -157,6 +171,17 @@ namespace JT1078.Gateway
context.Response.Close(); context.Response.Close();
} }


private async ValueTask Http400(HttpListenerContext context)
{
byte[] b = Encoding.UTF8.GetBytes($"sim and channel parameter required.");
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
context.Response.KeepAlive = false;
context.Response.ContentLength64 = b.Length;
var output = context.Response.OutputStream;
await output.WriteAsync(b, 0, b.Length);
context.Response.Close();
}
private void Http404(HttpListenerContext context) private void Http404(HttpListenerContext context)
{ {
context.Response.StatusCode = (int)HttpStatusCode.NotFound; context.Response.StatusCode = (int)HttpStatusCode.NotFound;


+ 1
- 0
src/JT1078.Gateway/JT1078UdpServer.cs 查看文件

@@ -127,6 +127,7 @@ namespace JT1078.Gateway
try try
{ {
var package = JT1078Serializer.Deserialize(buffer); var package = JT1078Serializer.Deserialize(buffer);
package.SIM = package.SIM.TrimStart('0');
if (Logger.IsEnabled(LogLevel.Trace)) Logger.LogTrace($"[Accept Hex {receiveMessageFromResult.RemoteEndPoint}]:{buffer.ToArray().ToHexString()}"); if (Logger.IsEnabled(LogLevel.Trace)) Logger.LogTrace($"[Accept Hex {receiveMessageFromResult.RemoteEndPoint}]:{buffer.ToArray().ToHexString()}");
var session = SessionManager.TryLink(package.SIM, socket, receiveMessageFromResult.RemoteEndPoint); var session = SessionManager.TryLink(package.SIM, socket, receiveMessageFromResult.RemoteEndPoint);
if (Logger.IsEnabled(LogLevel.Information)) if (Logger.IsEnabled(LogLevel.Information))


+ 17
- 0
src/JT1078.Gateway/Metadata/JT1078HttpContext.cs 查看文件

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using System.Net.WebSockets;
using System.Security.Principal; using System.Security.Principal;
using System.Text; using System.Text;


@@ -9,11 +10,27 @@ namespace JT1078.Gateway.Metadata
public class JT1078HttpContext public class JT1078HttpContext
{ {
public HttpListenerContext Context { get; } public HttpListenerContext Context { get; }
public HttpListenerWebSocketContext WebSocketContext { get; }
public IPrincipal User { get; } public IPrincipal User { get; }
public string Sim { get; set; }
public int ChannelNo { get; set; }
public bool IsWebSocket
{
get
{
return Context.Request.IsWebSocketRequest;
}
}
public JT1078HttpContext(HttpListenerContext context, IPrincipal user) public JT1078HttpContext(HttpListenerContext context, IPrincipal user)
{ {
Context = context; Context = context;
User = user; User = user;
} }
public JT1078HttpContext(HttpListenerContext context, HttpListenerWebSocketContext webSocketContext, IPrincipal user)
{
Context = context;
WebSocketContext = webSocketContext;
User = user;
}
} }
} }

正在加载...
取消
保存