常规项目提交
This commit is contained in:
parent
11a9f06bfa
commit
f97a9ba6be
2
.gitignore
vendored
2
.gitignore
vendored
@ -80,3 +80,5 @@ wwwroot/
|
|||||||
*.sln.ide
|
*.sln.ide
|
||||||
wwwroot/
|
wwwroot/
|
||||||
App_Data/
|
App_Data/
|
||||||
|
*.Debug/
|
||||||
|
*.Release/
|
13
12306.sln
13
12306.sln
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 2013
|
# Visual Studio 14
|
||||||
VisualStudioVersion = 12.0.31101.0
|
VisualStudioVersion = 14.0.22823.1
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web12306", "Web12306\Web12306.csproj", "{56406C67-2B6F-4152-9EC0-E6D80E86B96D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web12306", "Web12306\Web12306.csproj", "{56406C67-2B6F-4152-9EC0-E6D80E86B96D}"
|
||||||
EndProject
|
EndProject
|
||||||
@ -44,6 +44,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSLib.MvcWeb.Net4", "..\..\
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSLib.Web.NET4", "..\..\Private\iFish\FSLib.Web\FSLib.Web.NET4.csproj", "{6D27C5EE-D44F-4783-B25E-6165F495349B}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSLib.Web.NET4", "..\..\Private\iFish\FSLib.Web\FSLib.Web.NET4.csproj", "{6D27C5EE-D44F-4783-B25E-6165F495349B}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "聊天室", "聊天室", "{063A8FD8-F5AE-49BD-B68A-A395D64AF2F9}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChatRoomServer.Main", "ChatRoomServer.Main\ChatRoomServer.Main.csproj", "{928F1064-DAD6-4583-9A7E-C9510ADD94A1}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@ -98,6 +102,10 @@ Global
|
|||||||
{6D27C5EE-D44F-4783-B25E-6165F495349B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{6D27C5EE-D44F-4783-B25E-6165F495349B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{6D27C5EE-D44F-4783-B25E-6165F495349B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{6D27C5EE-D44F-4783-B25E-6165F495349B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{6D27C5EE-D44F-4783-B25E-6165F495349B}.Release|Any CPU.Build.0 = Release|Any CPU
|
{6D27C5EE-D44F-4783-B25E-6165F495349B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{928F1064-DAD6-4583-9A7E-C9510ADD94A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{928F1064-DAD6-4583-9A7E-C9510ADD94A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{928F1064-DAD6-4583-9A7E-C9510ADD94A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{928F1064-DAD6-4583-9A7E-C9510ADD94A1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@ -115,5 +123,6 @@ Global
|
|||||||
{6D4588AA-A0FD-4364-972C-22B0AB7938F9} = {5EBCE730-C2C7-478B-BD0C-C4BE3BC69C06}
|
{6D4588AA-A0FD-4364-972C-22B0AB7938F9} = {5EBCE730-C2C7-478B-BD0C-C4BE3BC69C06}
|
||||||
{AB7ED70A-3BB7-485A-A93F-05E7A5892086} = {5EBCE730-C2C7-478B-BD0C-C4BE3BC69C06}
|
{AB7ED70A-3BB7-485A-A93F-05E7A5892086} = {5EBCE730-C2C7-478B-BD0C-C4BE3BC69C06}
|
||||||
{6D27C5EE-D44F-4783-B25E-6165F495349B} = {5EBCE730-C2C7-478B-BD0C-C4BE3BC69C06}
|
{6D27C5EE-D44F-4783-B25E-6165F495349B} = {5EBCE730-C2C7-478B-BD0C-C4BE3BC69C06}
|
||||||
|
{928F1064-DAD6-4583-9A7E-C9510ADD94A1} = {063A8FD8-F5AE-49BD-B68A-A395D64AF2F9}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
14
ChatRoomServer.Main/App.config
Normal file
14
ChatRoomServer.Main/App.config
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
|
||||||
|
</configSections>
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="FSLib.Extension" publicKeyToken="61d6a007a0eb6994" culture="neutral"/>
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-1.2.0.0" newVersion="1.2.0.0"/>
|
||||||
|
</dependentAssembly>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
|
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/></startup></configuration>
|
108
ChatRoomServer.Main/ChatRoomServer.Main.csproj
Normal file
108
ChatRoomServer.Main/ChatRoomServer.Main.csproj
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{928F1064-DAD6-4583-9A7E-C9510ADD94A1}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>ChatRoomServer.Main</RootNamespace>
|
||||||
|
<AssemblyName>ChatRoomServer.Main</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>..\_.ChatRoomServer.Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>..\_.ChatRoomServer.Debug\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<StartupObject />
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="FSLib.Logs">
|
||||||
|
<HintPath>..\..\..\Private\iFishWinForm\12306TOBA\TOBA\TOBA.Server.Release\FSLib.Logs.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="FSLib.Network.Log4Net">
|
||||||
|
<HintPath>..\..\..\Private\iFishWinForm\12306TOBA\TOBA\TOBA.Server.Release\FSLib.Network.Log4Net.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="FSLib.Network.SuperSocket">
|
||||||
|
<HintPath>..\..\..\Private\iFishWinForm\12306TOBA\TOBA\TOBA.Server.Release\FSLib.Network.SuperSocket.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="FSLib_SuperSocketService">
|
||||||
|
<HintPath>..\..\..\Private\iFishWinForm\12306TOBA\TOBA\TOBA.Server.Release\FSLib_SuperSocketService.exe</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="ChatServer.cs" />
|
||||||
|
<Compile Include="ChatSession.cs" />
|
||||||
|
<Compile Include="Entities\EntityUtility.cs" />
|
||||||
|
<Compile Include="Entities\MessageItem.cs" />
|
||||||
|
<Compile Include="Progam.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Room\RoomContainer.cs" />
|
||||||
|
<Compile Include="Room\RoomSessionContext.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
<None Include="Config\log4net.server.config">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="Config\log4net.supersocket.config">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="FSLib_SuperSocketService.exe.config">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\Private\iFishOs\FSLib.Extension\src\FSLib.Extension.csproj">
|
||||||
|
<Project>{6d4588aa-a0fd-4364-972c-22b0ab7938f9}</Project>
|
||||||
|
<Name>FSLib.Extension</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\..\Private\iFish\FSLib\FSLib_NET4.csproj">
|
||||||
|
<Project>{d46393a2-aeab-4876-aebf-84b993e66227}</Project>
|
||||||
|
<Name>FSLib_NET4</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
98
ChatRoomServer.Main/ChatServer.cs
Normal file
98
ChatRoomServer.Main/ChatServer.cs
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChatRoomServer.Main
|
||||||
|
{
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using ChatRoomServer.Main.Room;
|
||||||
|
using FSLib.Logs.Log4Net;
|
||||||
|
using FSLib.Network.SuperSocket.Protocols.WebSocket;
|
||||||
|
using FSLib.Network.SuperSocket.SocketBase;
|
||||||
|
|
||||||
|
class ChatServer : WebSocketServer<ChatSession>
|
||||||
|
{
|
||||||
|
static ILog _log;
|
||||||
|
static readonly object _lockObject = new object();
|
||||||
|
|
||||||
|
static ChatServer()
|
||||||
|
{
|
||||||
|
FSLib.Logs.Log4NetBootStraper.Initialize("log4net.server.config", "Server");
|
||||||
|
_log = GetLogger(typeof(ChatServer).Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConcurrentDictionary<ChatSession, RoomContainer> _containers;
|
||||||
|
ConcurrentDictionary<string, RoomContainer> _roomContainers;
|
||||||
|
|
||||||
|
internal static ILog GetLogger(string name)
|
||||||
|
{
|
||||||
|
return LogManager.GetLogger("Server", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when [started].
|
||||||
|
/// </summary>
|
||||||
|
protected override void OnStarted()
|
||||||
|
{
|
||||||
|
base.OnStarted();
|
||||||
|
|
||||||
|
NewDataReceived += ChatServer_NewDataReceived;
|
||||||
|
NewSessionConnected += ChatServer_NewSessionConnected;
|
||||||
|
NewMessageReceived += ChatServer_NewMessageReceived;
|
||||||
|
NewRequestReceived += ChatServer_NewRequestReceived;
|
||||||
|
SessionClosed += ChatServer_SessionClosed;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ChatServer_SessionClosed(ChatSession session, CloseReason value)
|
||||||
|
{
|
||||||
|
RoomContainer roomContainer;
|
||||||
|
if (_containers.TryRemove(session, out roomContainer))
|
||||||
|
{
|
||||||
|
roomContainer.Remove(session);
|
||||||
|
|
||||||
|
if (roomContainer.SessionCount == 0)
|
||||||
|
{
|
||||||
|
_roomContainers.TryRemove(roomContainer.Id, out roomContainer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ChatServer_NewRequestReceived(ChatSession session, FSLib.Network.SuperSocket.Protocols.WebSocket.Protocol.IWebSocketFragment requestInfo)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ChatServer_NewMessageReceived(ChatSession session, string value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ChatServer_NewSessionConnected(ChatSession session)
|
||||||
|
{
|
||||||
|
var cmd = session.Command;
|
||||||
|
|
||||||
|
if (cmd == "room")
|
||||||
|
{
|
||||||
|
var roomid = session.Id;
|
||||||
|
|
||||||
|
//TODO check roomid
|
||||||
|
|
||||||
|
var roomCtx = _roomContainers.GetOrAdd(roomid, _ => new RoomContainer(_));
|
||||||
|
_containers.AddOrUpdate(session, roomCtx);
|
||||||
|
roomCtx.Add(session);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
session.Close(CloseReason.ProtocolError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ChatServer_NewDataReceived(ChatSession session, byte[] value)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
38
ChatRoomServer.Main/ChatSession.cs
Normal file
38
ChatRoomServer.Main/ChatSession.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChatRoomServer.Main
|
||||||
|
{
|
||||||
|
using FSLib.Network.SuperSocket.Protocols.WebSocket;
|
||||||
|
|
||||||
|
class ChatSession : WebSocketSession<ChatSession>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 命令
|
||||||
|
/// </summary>
|
||||||
|
public string Command { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ID
|
||||||
|
/// </summary>
|
||||||
|
public string Id { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when [init].
|
||||||
|
/// </summary>
|
||||||
|
protected override void OnInit()
|
||||||
|
{
|
||||||
|
base.OnInit();
|
||||||
|
|
||||||
|
var path = Path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
if (path.Length >= 2)
|
||||||
|
{
|
||||||
|
Command = path[0];
|
||||||
|
Id = path[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
67
ChatRoomServer.Main/Config/log4net.server.config
Normal file
67
ChatRoomServer.Main/Config/log4net.server.config
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<FSLib.Logs.Log4Net>
|
||||||
|
<appender name="ServerErrorAppender" type="FSLib.Logs.Log4Net.Appender.RollingFileAppender">
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.LevelMatchFilter">
|
||||||
|
<levelToMatch value="ERROR" />
|
||||||
|
</filter>
|
||||||
|
<!--<filter type="FSLib.Logs.Log4Net.Filter.LoggerMatchFilter">
|
||||||
|
<acceptOnMatch value="true" />
|
||||||
|
<loggerToMatch value="FSLib.Network.Server" />
|
||||||
|
</filter>-->
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.DenyAllFilter" />
|
||||||
|
<File value="Logs\server_err.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datePattern value="yyyyMMdd" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="ServerInfoAppender" type="FSLib.Logs.Log4Net.Appender.RollingFileAppender">
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.LevelMatchFilter">
|
||||||
|
<levelToMatch value="INFO" />
|
||||||
|
</filter>
|
||||||
|
<!--<filter type="FSLib.Logs.Log4Net.Filter.LoggerMatchFilter">
|
||||||
|
<acceptOnMatch value="true" />
|
||||||
|
<loggerToMatch value="FSLib.Network.Server" />
|
||||||
|
</filter>-->
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.DenyAllFilter" />
|
||||||
|
<File value="Logs\server_info.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datePattern value="yyyyMMdd" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="ServerDebugAppender" type="FSLib.Logs.Log4Net.Appender.RollingFileAppender">
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.LevelMatchFilter">
|
||||||
|
<levelToMatch value="DEBUG" />
|
||||||
|
</filter>
|
||||||
|
<!--<filter type="FSLib.Logs.Log4Net.Filter.LoggerMatchFilter">
|
||||||
|
<acceptOnMatch value="true" />
|
||||||
|
<loggerToMatch value="FSLib.Network.Server" />
|
||||||
|
</filter>-->
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.DenyAllFilter" />
|
||||||
|
<File value="Logs\server_debug.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datePattern value="yyyyMMdd" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="ServerConsoleAppender" type="FSLib.Logs.Log4Net.Appender.ConsoleAppender">
|
||||||
|
<target value="Console.Out" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<root>
|
||||||
|
<level value="ALL" />
|
||||||
|
<appender-ref ref="ServerConsoleAppender" />
|
||||||
|
<appender-ref ref="ServerErrorAppender" />
|
||||||
|
<appender-ref ref="ServerInfoAppender" />
|
||||||
|
<appender-ref ref="ServerDebugAppender" />
|
||||||
|
</root>
|
||||||
|
</FSLib.Logs.Log4Net>
|
72
ChatRoomServer.Main/Config/log4net.supersocket.config
Normal file
72
ChatRoomServer.Main/Config/log4net.supersocket.config
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<FSLib.Logs.Log4Net>
|
||||||
|
<appender name="SuperSocketErrorAppender" type="FSLib.Logs.Log4Net.Appender.RollingFileAppender">
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.LevelMatchFilter">
|
||||||
|
<levelToMatch value="ERROR" />
|
||||||
|
</filter>
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.DenyAllFilter" />
|
||||||
|
<File value="Logs\ss_err.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datePattern value="yyyyMMdd" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="SuperSocketInfoAppender" type="FSLib.Logs.Log4Net.Appender.RollingFileAppender">
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.LevelMatchFilter">
|
||||||
|
<levelToMatch value="INFO" />
|
||||||
|
</filter>
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.DenyAllFilter" />
|
||||||
|
<File value="Logs\ss_info.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datePattern value="yyyyMMdd" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="SuperSocketDebugAppender" type="FSLib.Logs.Log4Net.Appender.RollingFileAppender">
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.LevelMatchFilter">
|
||||||
|
<levelToMatch value="DEBUG" />
|
||||||
|
</filter>
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.DenyAllFilter" />
|
||||||
|
<File value="Logs\ss_debug.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datePattern value="yyyyMMdd" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="SuperSocketPerfAppender" type="FSLib.Logs.Log4Net.Appender.RollingFileAppender">
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.LevelMatchFilter">
|
||||||
|
<levelToMatch value="INFO" />
|
||||||
|
</filter>
|
||||||
|
<filter type="FSLib.Logs.Log4Net.Filter.DenyAllFilter" />
|
||||||
|
<File value="Logs\ss_perf.log" />
|
||||||
|
<appendToFile value="true" />
|
||||||
|
<rollingStyle value="Date" />
|
||||||
|
<datePattern value="yyyyMMdd" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<appender name="ServerConsoleAppender" type="FSLib.Logs.Log4Net.Appender.ConsoleAppender">
|
||||||
|
<target value="Console.Out" />
|
||||||
|
<layout type="FSLib.Logs.Log4Net.Layout.PatternLayout">
|
||||||
|
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
|
||||||
|
</layout>
|
||||||
|
</appender>
|
||||||
|
<root>
|
||||||
|
<level value="ALL" />
|
||||||
|
<appender-ref ref="ServerConsoleAppender" />
|
||||||
|
<appender-ref ref="SuperSocketErrorAppender" />
|
||||||
|
<appender-ref ref="SuperSocketInfoAppender" />
|
||||||
|
<appender-ref ref="SuperSocketDebugAppender" />
|
||||||
|
</root>
|
||||||
|
<logger name="FSLib.Network.SuperSocket.SocketEngine.PerformanceMonitor" additivity="false">
|
||||||
|
<level value="ALL" />
|
||||||
|
<appender-ref ref="SuperSocketPerfAppender" />
|
||||||
|
</logger>
|
||||||
|
</FSLib.Logs.Log4Net>
|
162
ChatRoomServer.Main/Entities/EntityUtility.cs
Normal file
162
ChatRoomServer.Main/Entities/EntityUtility.cs
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChatRoomServer.Main.Entities
|
||||||
|
{
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
class EntityUtility
|
||||||
|
{
|
||||||
|
static readonly string EncryptKey = "iFishMessagePack";
|
||||||
|
static readonly byte[] EncryptKeyBuffer = Encoding.ASCII.GetBytes(EncryptKey);
|
||||||
|
static readonly int EncStart = 2;
|
||||||
|
static readonly Random Random = new Random();
|
||||||
|
|
||||||
|
public static MessageItem FromBuffer(byte[] buffer)
|
||||||
|
{
|
||||||
|
if (buffer.Length < 1 + EncryptKeyBuffer.Length || buffer[0] >= EncryptKeyBuffer.Length)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
//decrypt key
|
||||||
|
var key = EncryptKeyBuffer[buffer[0]];
|
||||||
|
for (int i = EncStart; i < buffer.Length; i++)
|
||||||
|
{
|
||||||
|
var tkey = key;
|
||||||
|
key = buffer[i];
|
||||||
|
buffer[i] ^= tkey;
|
||||||
|
}
|
||||||
|
|
||||||
|
//read prefix
|
||||||
|
var index = 1;
|
||||||
|
if (Encoding.ASCII.GetString(buffer, index, EncryptKeyBuffer.Length) != EncryptKey)
|
||||||
|
return null;
|
||||||
|
index += EncryptKeyBuffer.Length;
|
||||||
|
|
||||||
|
var item = new MessageItem();
|
||||||
|
item.Action = ReadString(buffer, ref index);
|
||||||
|
item.Success = buffer[index++] == 1;
|
||||||
|
item.Time = System.FishDateTimeExtension.JsTicksStartBase.AddTicks(BitConverter.ToInt64(buffer, index) * 10000);
|
||||||
|
index += 8;
|
||||||
|
item.SystemMessage = buffer[index++] == 1;
|
||||||
|
item.SysMsgType = (SystemMessageType)BitConverter.ToInt32(buffer, index);
|
||||||
|
index += 4;
|
||||||
|
item.UserMsgType = (UserMessageType)BitConverter.ToInt32(buffer, index);
|
||||||
|
index += 4;
|
||||||
|
item.Content = ReadString(buffer, ref index);
|
||||||
|
item.Color = ReadString(buffer, ref index);
|
||||||
|
//images
|
||||||
|
var imgCount = BitConverter.ToInt32(buffer, index);
|
||||||
|
index += 4;
|
||||||
|
if (imgCount > 0)
|
||||||
|
{
|
||||||
|
item.Images = new string[imgCount];
|
||||||
|
for (int i = 0; i < imgCount; i++)
|
||||||
|
{
|
||||||
|
item.Images[i] = ReadString(buffer, ref index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//from
|
||||||
|
item.From = ReadString(buffer, ref index);
|
||||||
|
//to
|
||||||
|
var tousersCount = BitConverter.ToInt32(buffer, index);
|
||||||
|
index += 4;
|
||||||
|
if (tousersCount > 0)
|
||||||
|
{
|
||||||
|
item.ToUsers = new string[tousersCount];
|
||||||
|
for (int i = 0; i < tousersCount; i++)
|
||||||
|
{
|
||||||
|
item.ToUsers[i] = ReadString(buffer, ref index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ReadString(byte[] data, ref int index)
|
||||||
|
{
|
||||||
|
var unicode = data[index++] == 1;
|
||||||
|
var length = BitConverter.ToInt32(data, index);
|
||||||
|
index += 4;
|
||||||
|
|
||||||
|
var result = (unicode ? Encoding.Unicode : Encoding.ASCII).GetString(data, index, length);
|
||||||
|
index += length;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] ToBuffer(MessageItem item)
|
||||||
|
{
|
||||||
|
var length = (item.Content?.Length ?? 0) * 3 + 100;
|
||||||
|
var randomKeyIndex = Random.Next(EncryptKey.Length);
|
||||||
|
var randomKey = (byte)EncryptKey[randomKeyIndex];
|
||||||
|
|
||||||
|
using (var ms = new MemoryStream(length))
|
||||||
|
{
|
||||||
|
//1. write encrypt key
|
||||||
|
ms.Write(new byte[] { (byte)randomKeyIndex });
|
||||||
|
//1. write package header
|
||||||
|
ms.Write(EncryptKeyBuffer);
|
||||||
|
|
||||||
|
//3. write action
|
||||||
|
Write(ms, item.Action, false);
|
||||||
|
//4. write success
|
||||||
|
ms.Write(new[] { (byte)(item.Success ? 1 : 0) });
|
||||||
|
//5. write time
|
||||||
|
ms.Write(item.Time.ToJsTicks());
|
||||||
|
//6. system message
|
||||||
|
ms.Write(new[] { (byte)(item.SystemMessage ? 1 : 0) });
|
||||||
|
//7.
|
||||||
|
ms.Write((int)item.SysMsgType);
|
||||||
|
//8.
|
||||||
|
ms.Write((int)item.UserMsgType);
|
||||||
|
//9. content
|
||||||
|
Write(ms, item.Content, true);
|
||||||
|
//10. color
|
||||||
|
Write(ms, item.Color, false);
|
||||||
|
//11. images
|
||||||
|
ms.Write(item.Images?.Length ?? 0);
|
||||||
|
if (item.Images != null)
|
||||||
|
{
|
||||||
|
foreach (var image in item.Images)
|
||||||
|
{
|
||||||
|
Write(ms, image, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//12. from user
|
||||||
|
Write(ms, item.From, false);
|
||||||
|
//13. to user
|
||||||
|
ms.Write(item.ToUsers?.Length ?? 0);
|
||||||
|
if (item.ToUsers != null)
|
||||||
|
{
|
||||||
|
foreach (var user in item.ToUsers)
|
||||||
|
{
|
||||||
|
Write(ms, user, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var data = ms.ToArray();
|
||||||
|
for (int i = EncStart; i < data.Length; i++)
|
||||||
|
{
|
||||||
|
randomKey = data[i] ^= randomKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Write(Stream stream, string text, bool unicode = true)
|
||||||
|
{
|
||||||
|
text = text ?? "";
|
||||||
|
|
||||||
|
var buffer = unicode ? Encoding.Unicode.GetBytes(text) : Encoding.ASCII.GetBytes(text);
|
||||||
|
stream.Write(new[] { (byte)(unicode ? 1 : 0) });
|
||||||
|
stream.Write(buffer.Length);
|
||||||
|
stream.Write(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
ChatRoomServer.Main/Entities/MessageItem.cs
Normal file
57
ChatRoomServer.Main/Entities/MessageItem.cs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChatRoomServer.Main.Entities
|
||||||
|
{
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
class MessageItem
|
||||||
|
{
|
||||||
|
public string Action { get; set; }
|
||||||
|
|
||||||
|
public bool Success { get; set; }
|
||||||
|
|
||||||
|
public DateTime Time { get; set; }
|
||||||
|
|
||||||
|
public bool SystemMessage { get; set; }
|
||||||
|
|
||||||
|
public SystemMessageType SysMsgType { get; set; }
|
||||||
|
|
||||||
|
public UserMessageType UserMsgType { get; set; }
|
||||||
|
|
||||||
|
public string Content { get; set; }
|
||||||
|
|
||||||
|
public string Color { get; set; }
|
||||||
|
|
||||||
|
public string[] Images { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public string From { get; set; }
|
||||||
|
|
||||||
|
public string[] ToUsers { get; set; }
|
||||||
|
|
||||||
|
public byte[] ToBuffer() => EntityUtility.ToBuffer(this);
|
||||||
|
|
||||||
|
public static MessageItem Decode(byte[] buffer) => EntityUtility.FromBuffer(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SystemMessageType
|
||||||
|
{
|
||||||
|
Unknown = 0,
|
||||||
|
UserEnter = 1,
|
||||||
|
UserExit = 2,
|
||||||
|
Disconnect = 3,
|
||||||
|
UpdateStat = 4,
|
||||||
|
SendFailed = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
enum UserMessageType
|
||||||
|
{
|
||||||
|
Unknown = 0,
|
||||||
|
Send,
|
||||||
|
Receive
|
||||||
|
}
|
||||||
|
}
|
59
ChatRoomServer.Main/FSLib_SuperSocketService.exe.config
Normal file
59
ChatRoomServer.Main/FSLib_SuperSocketService.exe.config
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<section name="superSocket"
|
||||||
|
type="FSLib.Network.SuperSocket.SocketEngine.Configuration.SocketServiceConfig, FSLib.Network.SuperSocket" />
|
||||||
|
</configSections>
|
||||||
|
<connectionStrings>
|
||||||
|
<add name="Rw" providerName="System.Data.SqlClient" connectionString="Data Source=connect.fishlee.net; uid=sa; pwd=icufish99**; initial catalog=Cn12306.Chat"/>
|
||||||
|
</connectionStrings>
|
||||||
|
<appSettings>
|
||||||
|
<add key="Ss:ServiceName" value="12306聊天室服务器_1" />
|
||||||
|
<add key="ss:ServiceDescription" value="Chat12306_Group1" />
|
||||||
|
<add key="ss:ServicesDependedOn" value="tcpip"/>
|
||||||
|
|
||||||
|
<add key="FishSite_EncryptKey" value="RBVqM7V7RbdAuGl/bYAbu7FYFn7Wkb/rXFDO7k47iFA=;Ve5RM42hrH6njRyJUfEQIw=="/>
|
||||||
|
</appSettings>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
|
||||||
|
</startup>
|
||||||
|
<superSocket isolation="None" maxCompletionPortThreads="300" maxWorkingThreads="500">
|
||||||
|
<servers>
|
||||||
|
<!--
|
||||||
|
<server name="SilverlightPolicyServer"
|
||||||
|
serverType="SuperSocket.Facility.PolicyServer.SilverlightPolicyServer, SuperSocket.Facility"
|
||||||
|
ip="Any" port="943"
|
||||||
|
receiveBufferSize="32"
|
||||||
|
maxConnectionNumber="10"
|
||||||
|
policyFile="Config\Silverlight.config"
|
||||||
|
clearIdleSession="true">
|
||||||
|
</server>
|
||||||
|
-->
|
||||||
|
<server name="ManagementServer" serverType="FSLib.Network.SuperSocket.ServerManager.ManagementServer, FSLib.Network.SuperSocket">
|
||||||
|
<listeners>
|
||||||
|
<add ip="Any" port="7999" />
|
||||||
|
</listeners>
|
||||||
|
<commandAssemblies>
|
||||||
|
<add assembly="FSLib.Network"/>
|
||||||
|
</commandAssemblies>
|
||||||
|
<users>
|
||||||
|
<user name="admin" password="am12348"/>
|
||||||
|
</users>
|
||||||
|
</server>
|
||||||
|
<server name="Chat12306Server_51050" serverType="ChatRoomServer.Main.ChatServer, ChatRoomServer.Main" maxConnectionNumber="10000">
|
||||||
|
<listeners>
|
||||||
|
<add ip="Any" port="51050" />
|
||||||
|
</listeners>
|
||||||
|
<subProtocols>
|
||||||
|
<!--<protocol name="FishLee" />-->
|
||||||
|
</subProtocols>
|
||||||
|
</server>
|
||||||
|
</servers>
|
||||||
|
<logFactories>
|
||||||
|
<add name="log4net" type="FSLib.Network.Log4Net.SuperSocket.Log4NetLogFactory, FSLib.Network.Log4Net"/>
|
||||||
|
</logFactories>
|
||||||
|
<services>
|
||||||
|
</services>
|
||||||
|
</superSocket>
|
||||||
|
|
||||||
|
</configuration>
|
25
ChatRoomServer.Main/Progam.cs
Normal file
25
ChatRoomServer.Main/Progam.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChatRoomServer.Main
|
||||||
|
{
|
||||||
|
using ChatRoomServer.Main.Entities;
|
||||||
|
|
||||||
|
class Progam
|
||||||
|
{
|
||||||
|
public static void Main()
|
||||||
|
{
|
||||||
|
var data=new MessageItem()
|
||||||
|
{
|
||||||
|
Action="test",
|
||||||
|
Content="Content"
|
||||||
|
};
|
||||||
|
var buffer = data.ToBuffer();
|
||||||
|
|
||||||
|
var itemback = MessageItem.Decode(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
ChatRoomServer.Main/Properties/AssemblyInfo.cs
Normal file
36
ChatRoomServer.Main/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// 有关程序集的常规信息通过以下
|
||||||
|
// 特性集控制。更改这些特性值可修改
|
||||||
|
// 与程序集关联的信息。
|
||||||
|
[assembly: AssemblyTitle("ChatRoomServer.Main")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("ChatRoomServer.Main")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// 将 ComVisible 设置为 false 使此程序集中的类型
|
||||||
|
// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
|
||||||
|
// 则将该类型上的 ComVisible 特性设置为 true。
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
||||||
|
[assembly: Guid("928f1064-dad6-4583-9a7e-c9510add94a1")]
|
||||||
|
|
||||||
|
// 程序集的版本信息由下面四个值组成:
|
||||||
|
//
|
||||||
|
// 主版本
|
||||||
|
// 次版本
|
||||||
|
// 生成号
|
||||||
|
// 修订号
|
||||||
|
//
|
||||||
|
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||||
|
// 方法是按如下所示使用“*”:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
41
ChatRoomServer.Main/Room/RoomContainer.cs
Normal file
41
ChatRoomServer.Main/Room/RoomContainer.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChatRoomServer.Main.Room
|
||||||
|
{
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
|
class RoomContainer
|
||||||
|
{
|
||||||
|
ConcurrentDictionary<ChatSession, RoomSessionContext> _contexts = new ConcurrentDictionary<ChatSession, RoomSessionContext>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获得或设置房间ID
|
||||||
|
/// </summary>
|
||||||
|
public string Id { get; private set; }
|
||||||
|
|
||||||
|
public RoomContainer(string id)
|
||||||
|
{
|
||||||
|
Id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(ChatSession session)
|
||||||
|
{
|
||||||
|
_contexts.GetOrAdd(session, new RoomSessionContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Remove(ChatSession session)
|
||||||
|
{
|
||||||
|
RoomSessionContext context;
|
||||||
|
_contexts.TryRemove(session, out context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获得会话数
|
||||||
|
/// </summary>
|
||||||
|
public int SessionCount => _contexts.Count;
|
||||||
|
}
|
||||||
|
}
|
12
ChatRoomServer.Main/Room/RoomSessionContext.cs
Normal file
12
ChatRoomServer.Main/Room/RoomSessionContext.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChatRoomServer.Main.Room
|
||||||
|
{
|
||||||
|
class RoomSessionContext
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
4
ChatRoomServer.Main/packages.config
Normal file
4
ChatRoomServer.Main/packages.config
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="EntityFramework" version="6.1.3" targetFramework="net451" userInstalled="true" />
|
||||||
|
</packages>
|
@ -166,6 +166,7 @@ $(function () {
|
|||||||
e.stopPropagation && e.stopPropagation();
|
e.stopPropagation && e.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
var notifyAjaxComplete = function (key) {
|
var notifyAjaxComplete = function (key) {
|
||||||
var e = new CustomEvent("ajaxproxyfinished", { detail: key });
|
var e = new CustomEvent("ajaxproxyfinished", { detail: key });
|
||||||
document.dispatchEvent(e);
|
document.dispatchEvent(e);
|
||||||
@ -177,8 +178,8 @@ $(function () {
|
|||||||
var xhr = new XMLHttpRequest();
|
var xhr = new XMLHttpRequest();
|
||||||
xhr.open("GET", ctx.url, true);
|
xhr.open("GET", ctx.url, true);
|
||||||
xhr.onreadystatechange = function () {
|
xhr.onreadystatechange = function () {
|
||||||
if (xhr.readyState == 4) {
|
if (xhr.readyState === 4) {
|
||||||
if (xhr.status != 200) {
|
if (xhr.status !== 200) {
|
||||||
document.dispatchEvent(new CustomEvent("ajaxproxyfinished", {
|
document.dispatchEvent(new CustomEvent("ajaxproxyfinished", {
|
||||||
detail: {
|
detail: {
|
||||||
url: null,
|
url: null,
|
||||||
|
@ -258,6 +258,7 @@
|
|||||||
<Content Include="js\modules\doT.js" />
|
<Content Include="js\modules\doT.js" />
|
||||||
<Content Include="js\otn\encode.js" />
|
<Content Include="js\otn\encode.js" />
|
||||||
<Content Include="js\platform\lunarCalendar.js" />
|
<Content Include="js\platform\lunarCalendar.js" />
|
||||||
|
<Content Include="js\platform\messageCoder.js" />
|
||||||
<Content Include="js\ui\ui-oncetrainsitquery.js" />
|
<Content Include="js\ui\ui-oncetrainsitquery.js" />
|
||||||
<Content Include="js\otn\orderprocess.js" />
|
<Content Include="js\otn\orderprocess.js" />
|
||||||
<Content Include="js\otn\passenger.js" />
|
<Content Include="js\otn\passenger.js" />
|
||||||
|
@ -328,7 +328,7 @@
|
|||||||
exports.suggestRefreshInterval = 60000;
|
exports.suggestRefreshInterval = 60000;
|
||||||
Object.defineProperty(exports, "fastSubmitOrderSkipVc", {
|
Object.defineProperty(exports, "fastSubmitOrderSkipVc", {
|
||||||
get: function() {
|
get: function() {
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
myversion: "undefined"//,
|
myversion: "undefined"//,
|
||||||
//randCode_validate: utility.getVcValidate(code)
|
//randCode_validate: utility.getVcValidate(code)
|
||||||
}, "json", function () {
|
}, "json", function () {
|
||||||
if (!this.model.data || this.model.data.result != 1)
|
if (!this.model.data || this.model.data.result !== 1)
|
||||||
def.reject("验证码错误");
|
def.reject("验证码错误");
|
||||||
else def.resolve();
|
else def.resolve();
|
||||||
}, function () {
|
}, function () {
|
||||||
|
16
Web12306/js/platform/messageCoder.js
Normal file
16
Web12306/js/platform/messageCoder.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
define(function (require, exports, module) {
|
||||||
|
var keystr = "iFishMessagePack";
|
||||||
|
|
||||||
|
var decode = function(data) {
|
||||||
|
var dv = new Uint8Array(data);
|
||||||
|
var keyIndex = dv.getInt8(0);
|
||||||
|
var key = keystr.charCodeAt(keyIndex);
|
||||||
|
|
||||||
|
for (var i = 0; i < dv.length; i++) {
|
||||||
|
var byte = dv.getInt8();
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
});
|
@ -2,6 +2,7 @@
|
|||||||
define(function (require, exports, module) {
|
define(function (require, exports, module) {
|
||||||
var EventObject = require("../platform/EventObject.js");
|
var EventObject = require("../platform/EventObject.js");
|
||||||
var config = require("../data.js");
|
var config = require("../data.js");
|
||||||
|
var lastPromptPlatformError = null;
|
||||||
|
|
||||||
var WebRequest = function () {
|
var WebRequest = function () {
|
||||||
var that = this;
|
var that = this;
|
||||||
@ -40,8 +41,21 @@ define(function (require, exports, module) {
|
|||||||
requestMap[e.detail.index] = {
|
requestMap[e.detail.index] = {
|
||||||
done: function () {
|
done: function () {
|
||||||
var args = [].slice.call(arguments);
|
var args = [].slice.call(arguments);
|
||||||
|
|
||||||
|
if (this.headers.indexOf("application/json") !== -1 && this.text.indexOf('"status":false,"httpstatus":200,"messages":["网络繁忙"]') !== -1) {
|
||||||
|
//被封
|
||||||
|
if (!lastPromptPlatformError || (new Date().getTime() - lastPromptPlatformError) > 1000 * 60 * 5) {
|
||||||
|
lastPromptPlatformError = new Date().getTime();
|
||||||
|
document.dispatchEvent(new CustomEvent("ipBlockError"));
|
||||||
|
}
|
||||||
|
|
||||||
|
failed && failed.apply(this, args);
|
||||||
|
def.rejectWith(this, args);
|
||||||
|
} else {
|
||||||
done && done.apply(this, args);
|
done && done.apply(this, args);
|
||||||
def.resolveWith(this, args);
|
def.resolveWith(this, args);
|
||||||
|
}
|
||||||
|
|
||||||
config.debug("done request for " + xhrData.url);
|
config.debug("done request for " + xhrData.url);
|
||||||
},
|
},
|
||||||
fail: function () {
|
fail: function () {
|
||||||
@ -89,7 +103,9 @@ define(function (require, exports, module) {
|
|||||||
/// <param name="responseType">要请求的地址</param>
|
/// <param name="responseType">要请求的地址</param>
|
||||||
/// <param name="done">完成请求的回调</param>
|
/// <param name="done">完成请求的回调</param>
|
||||||
/// <param name="failed">请求失败的回调</param>
|
/// <param name="failed">请求失败的回调</param>
|
||||||
return that.send("GET", url, refer, data, responseType, done, failed, appendatt, headers);
|
var args = [].slice.call(arguments);
|
||||||
|
args.unshift("GET");
|
||||||
|
return that.send.apply(this, args);
|
||||||
};
|
};
|
||||||
this.sendPost = function (url, refer, data, responseType, done, failed, appendatt, headers) {
|
this.sendPost = function (url, refer, data, responseType, done, failed, appendatt, headers) {
|
||||||
var args = [].slice.call(arguments);
|
var args = [].slice.call(arguments);
|
||||||
|
@ -293,6 +293,9 @@
|
|||||||
closeOnAction: false
|
closeOnAction: false
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
document.addEventListener("ipBlockError", function() {
|
||||||
|
media.notify("IP被封警告", "检测到12306已封锁您的IP。如果频繁出现此问题请使用代理服务器或重启路由器 :-(");
|
||||||
|
});
|
||||||
})();
|
})();
|
||||||
|
|
||||||
//聊天系统
|
//聊天系统
|
||||||
|
Loading…
Reference in New Issue
Block a user