Commit eea918a9 authored by hex's avatar hex

Optimized TcpHelper.cs

parent d2b594a5
Pipeline #38589 failed
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Concurrent;
using System.IO; using System.IO;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
...@@ -12,10 +13,13 @@ public static class TcpHelper ...@@ -12,10 +13,13 @@ public static class TcpHelper
{ {
public static TcpClient tcpClient = null; public static TcpClient tcpClient = null;
static NetworkStream networkStream = null; private static NetworkStream networkStream = null;
private static bool canjoin = true;
private static bool roomListChecking = false;
static bool canjoin = true; public static bool onDisConnected = false;
static bool roomListChecking = false;
private static ConcurrentQueue<byte[]> datas = new ConcurrentQueue<byte[]>();
public static void join( public static void join(
string ipString, string ipString,
...@@ -89,123 +93,113 @@ public static class TcpHelper ...@@ -89,123 +93,113 @@ public static class TcpHelper
public static void addDateJumoLine(byte[] data) public static void addDateJumoLine(byte[] data)
{ {
Monitor.Enter(datas); // 不再需要手动加锁 Monitor.Enter/Exit
// ConcurrentQueue.Enqueue 本身就是线程安全的。
try try
{ {
datas.Add(data); datas.Enqueue(data);
} }
catch (System.Exception e) catch (System.Exception e)
{ {
// 保留异常处理逻辑
UnityEngine.Debug.Log(e); UnityEngine.Debug.Log(e);
} }
Monitor.Exit(datas);
} }
public static bool onDisConnected = false;
static List<byte[]> datas = new List<byte[]>();
public static void preFrameFunction() public static void preFrameFunction()
{ {
if (datas.Count > 0)
while (datas.TryDequeue(out byte[] data))
{ {
if (Monitor.TryEnter(datas)) try
{ {
for (int i = 0; i < datas.Count; i++) MemoryStream memoryStream = new MemoryStream(data);
BinaryReader r = new BinaryReader(memoryStream);
var ms = (StocMessage)(r.ReadByte());
switch (ms)
{ {
try case StocMessage.GameMsg:
{ Program.I().room.StocMessage_GameMsg(r);
MemoryStream memoryStream = new MemoryStream(datas[i]); break;
BinaryReader r = new BinaryReader(memoryStream); case StocMessage.ErrorMsg:
var ms = (StocMessage)(r.ReadByte()); Program.I().room.StocMessage_ErrorMsg(r);
switch (ms) break;
{ case StocMessage.SelectHand:
case StocMessage.GameMsg: Program.I().room.StocMessage_SelectHand(r);
Program.I().room.StocMessage_GameMsg(r); break;
break; case StocMessage.SelectTp:
case StocMessage.ErrorMsg: Program.I().room.StocMessage_SelectTp(r);
Program.I().room.StocMessage_ErrorMsg(r); break;
break; case StocMessage.HandResult:
case StocMessage.SelectHand: Program.I().room.StocMessage_HandResult(r);
Program.I().room.StocMessage_SelectHand(r); break;
break; case StocMessage.TpResult:
case StocMessage.SelectTp: Program.I().room.StocMessage_TpResult(r);
Program.I().room.StocMessage_SelectTp(r); break;
break; case StocMessage.ChangeSide:
case StocMessage.HandResult: Program.I().room.StocMessage_ChangeSide(r);
Program.I().room.StocMessage_HandResult(r); // TcpHelper.SaveRecord();
break; break;
case StocMessage.TpResult: case StocMessage.WaitingSide:
Program.I().room.StocMessage_TpResult(r); Program.I().room.StocMessage_WaitingSide(r);
break; // TcpHelper.SaveRecord();
case StocMessage.ChangeSide: break;
Program.I().room.StocMessage_ChangeSide(r); case StocMessage.DeckCount:
// TcpHelper.SaveRecord(); Program.I().room.StocMessage_DeckCount(r);
break; break;
case StocMessage.WaitingSide: case StocMessage.CreateGame:
Program.I().room.StocMessage_WaitingSide(r); Program.I().room.StocMessage_CreateGame(r);
// TcpHelper.SaveRecord(); break;
break; case StocMessage.JoinGame:
case StocMessage.DeckCount: Program.I().room.StocMessage_JoinGame(r);
Program.I().room.StocMessage_DeckCount(r); break;
break; case StocMessage.TypeChange:
case StocMessage.CreateGame: Program.I().room.StocMessage_TypeChange(r);
Program.I().room.StocMessage_CreateGame(r); break;
break; case StocMessage.LeaveGame:
case StocMessage.JoinGame: Program.I().room.StocMessage_LeaveGame(r);
Program.I().room.StocMessage_JoinGame(r); break;
break; case StocMessage.DuelStart:
case StocMessage.TypeChange: Program.I().room.StocMessage_DuelStart(r);
Program.I().room.StocMessage_TypeChange(r); break;
break; case StocMessage.DuelEnd:
case StocMessage.LeaveGame: Program.I().room.StocMessage_DuelEnd(r);
Program.I().room.StocMessage_LeaveGame(r); // TcpHelper.SaveRecord();
break; break;
case StocMessage.DuelStart: case StocMessage.Replay:
Program.I().room.StocMessage_DuelStart(r); Program.I().room.StocMessage_Replay(r);
break; // TcpHelper.SaveRecord();
case StocMessage.DuelEnd: break;
Program.I().room.StocMessage_DuelEnd(r); case StocMessage.TimeLimit:
// TcpHelper.SaveRecord(); Program.I().ocgcore.StocMessage_TimeLimit(r);
break; break;
case StocMessage.Replay: case StocMessage.Chat:
Program.I().room.StocMessage_Replay(r); Program.I().room.StocMessage_Chat(r);
// TcpHelper.SaveRecord(); break;
break; case StocMessage.HsPlayerEnter:
case StocMessage.TimeLimit: Program.I().room.StocMessage_HsPlayerEnter(r);
Program.I().ocgcore.StocMessage_TimeLimit(r); break;
break; case StocMessage.HsPlayerChange:
case StocMessage.Chat: Program.I().room.StocMessage_HsPlayerChange(r);
Program.I().room.StocMessage_Chat(r); break;
break; case StocMessage.HsWatchChange:
case StocMessage.HsPlayerEnter: Program.I().room.StocMessage_HsWatchChange(r);
Program.I().room.StocMessage_HsPlayerEnter(r); break;
break; case StocMessage.TeammateSurrender:
case StocMessage.HsPlayerChange: Program.I().room.StocMessage_TeammateSurrender(r);
Program.I().room.StocMessage_HsPlayerChange(r); break;
break; case YGOSharp.Network.Enums.StocMessage.RoomList:
case StocMessage.HsWatchChange: ((Room)Program.I().room).StocMessage_RoomList(r);
Program.I().room.StocMessage_HsWatchChange(r); break;
break; default:
case StocMessage.TeammateSurrender: break;
Program.I().room.StocMessage_TeammateSurrender(r);
break;
case YGOSharp.Network.Enums.StocMessage.RoomList:
((Room)Program.I().room).StocMessage_RoomList(r);
break;
default:
break;
}
}
catch (System.Exception e)
{
// Program.DEBUGLOG(e);
}
} }
datas.Clear(); }
Monitor.Exit(datas); catch (System.Exception e)
{
// Program.DEBUGLOG(e);
} }
} }
if (onDisConnected == true) if (onDisConnected == true)
{ {
onDisConnected = false; onDisConnected = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment