常规项目提交

This commit is contained in:
木鱼(iFish) 2015-07-01 16:18:25 +08:00
parent 11a9f06bfa
commit f97a9ba6be
23 changed files with 851 additions and 10 deletions

2
.gitignore vendored
View File

@ -80,3 +80,5 @@ wwwroot/
*.sln.ide
wwwroot/
App_Data/
*.Debug/
*.Release/

View File

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.31101.0
# Visual Studio 14
VisualStudioVersion = 14.0.22823.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web12306", "Web12306\Web12306.csproj", "{56406C67-2B6F-4152-9EC0-E6D80E86B96D}"
EndProject
@ -44,6 +44,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSLib.MvcWeb.Net4", "..\..\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSLib.Web.NET4", "..\..\Private\iFish\FSLib.Web\FSLib.Web.NET4.csproj", "{6D27C5EE-D44F-4783-B25E-6165F495349B}"
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
GlobalSection(SolutionConfigurationPlatforms) = preSolution
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}.Release|Any CPU.ActiveCfg = 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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -115,5 +123,6 @@ Global
{6D4588AA-A0FD-4364-972C-22B0AB7938F9} = {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}
{928F1064-DAD6-4583-9A7E-C9510ADD94A1} = {063A8FD8-F5AE-49BD-B68A-A395D64AF2F9}
EndGlobalSection
EndGlobal

View 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>

View 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>

View 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)
{
}
}
}

View 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];
}
}
}
}

View 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>

View 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>

View 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);
}
}
}

View 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
}
}

View 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>

View 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);
}
}
}

View 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")]

View 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;
}
}

View 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
{
}
}

View 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>

View File

@ -166,6 +166,7 @@ $(function () {
e.stopPropagation && e.stopPropagation();
});
var notifyAjaxComplete = function (key) {
var e = new CustomEvent("ajaxproxyfinished", { detail: key });
document.dispatchEvent(e);
@ -177,8 +178,8 @@ $(function () {
var xhr = new XMLHttpRequest();
xhr.open("GET", ctx.url, true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status != 200) {
if (xhr.readyState === 4) {
if (xhr.status !== 200) {
document.dispatchEvent(new CustomEvent("ajaxproxyfinished", {
detail: {
url: null,

View File

@ -258,6 +258,7 @@
<Content Include="js\modules\doT.js" />
<Content Include="js\otn\encode.js" />
<Content Include="js\platform\lunarCalendar.js" />
<Content Include="js\platform\messageCoder.js" />
<Content Include="js\ui\ui-oncetrainsitquery.js" />
<Content Include="js\otn\orderprocess.js" />
<Content Include="js\otn\passenger.js" />

View File

@ -328,7 +328,7 @@
exports.suggestRefreshInterval = 60000;
Object.defineProperty(exports, "fastSubmitOrderSkipVc", {
get: function() {
return true;
return false;
}
});

View File

@ -13,7 +13,7 @@
myversion: "undefined"//,
//randCode_validate: utility.getVcValidate(code)
}, "json", function () {
if (!this.model.data || this.model.data.result != 1)
if (!this.model.data || this.model.data.result !== 1)
def.reject("验证码错误");
else def.resolve();
}, function () {

View 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();
}
};
});

View File

@ -2,6 +2,7 @@
define(function (require, exports, module) {
var EventObject = require("../platform/EventObject.js");
var config = require("../data.js");
var lastPromptPlatformError = null;
var WebRequest = function () {
var that = this;
@ -40,8 +41,21 @@ define(function (require, exports, module) {
requestMap[e.detail.index] = {
done: function () {
var args = [].slice.call(arguments);
done && done.apply(this, args);
def.resolveWith(this, args);
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);
def.resolveWith(this, args);
}
config.debug("done request for " + xhrData.url);
},
fail: function () {
@ -89,7 +103,9 @@ define(function (require, exports, module) {
/// <param name="responseType">要请求的地址</param>
/// <param name="done">完成请求的回调</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) {
var args = [].slice.call(arguments);

View File

@ -293,6 +293,9 @@
closeOnAction: false
});
});
document.addEventListener("ipBlockError", function() {
media.notify("IP被封警告", "检测到12306已封锁您的IP。如果频繁出现此问题请使用代理服务器或重启路由器 :-(");
});
})();
//聊天系统