예제 #1
0
    async Task NetworkStreamHandler(TcpClient client)
    {
        while (client.Connected)
        {
            var stream    = client.GetStream();
            var buffer    = new byte[4096];
            var byteCount = await stream.ReadAsync(buffer, 0, buffer.Length);

            stream.Flush();
            if (byteCount == 0)
            {
                break;             //断线了
            }
            var str = Encoding.UTF8.GetString(buffer, 0, byteCount);
            var msg = JsonUtility.FromJson <Message>(str);
            Debug.Log($"[播放器]收到信息 {str}");
            UnitySynchronizationContext.Post(() =>
            {
                if (Application.isPlaying)
                {
                    EventManager.Invoke(msg);
                }
            });
        }
    }
예제 #2
0
 void SendNetMessage(string str)
 {
     try
     {
         if (null != tcpClient && tcpClient.Connected)
         {
             var networkStream      = tcpClient.GetStream();
             var ClientRequestBytes = Encoding.UTF8.GetBytes(str);
             networkStream.Write(ClientRequestBytes, 0, ClientRequestBytes.Length);
             networkStream.Flush();
             Debug.Log($"[控制器] 发送到播放器消息 {str}!");
             UnitySynchronizationContext.Post(() => { if (message)
                                                      {
                                                          message.text = $"[控制器] 发送到播放器消息 {str}!";
                                                      }
                                              });
         }
     }
     catch (Exception e)
     {
         UnitySynchronizationContext.Post(() => { if (message)
                                                  {
                                                      message.text = $"[控制器] 发送消息到播放器错误 {e}!";
                                                  }
                                          });
         throw;
     }
 }
예제 #3
0
    async Task StreamReadHandleAsync()
    {
        Debug.Log("开启数据读逻辑");
        try
        {
            while (isRun && tcpClient.Connected)
            {
                var networkStream = tcpClient.GetStream();
                var buffer        = new byte[4096];
                var byteCount     = await networkStream.ReadAsync(buffer, 0, buffer.Length);

                if (byteCount == 0)
                {
                    break;                //服务器端口
                }
                var response = Encoding.UTF8.GetString(buffer, 0, byteCount);
                Debug.Log($"[控制器] 接收到播放器消息 {response}!");
                UnitySynchronizationContext.Post(() => EventManager.Invoke(JsonUtility.FromJson <Message>(response)));
            }
        }
        catch (Exception e)
        {
            UnitySynchronizationContext.Post(() => { if (message)
                                                     {
                                                         message.text = $"[控制器] 接收消息失败: {e}!";
                                                     }
                                             });
            throw;
        }
    }
예제 #4
0
    static void OutputResult(IntPtr resultStringPointer, int length)
    {
        var buffer = new byte[length];

        Marshal.Copy(resultStringPointer, buffer, 0, length);
        // var result = USEncoder.ToEncoding.ToUnicode(buffer);

        var result = System.Text.Encoding.UTF8.GetString(buffer);

        DebugLog(result);

        context.Post((r) => { if (ResultReceived != null)
                              {
                                  ResultReceived((string)r);
                              }
                     }, result);
    }
 public static void DoOnUnityThread(Action action)
 {
     if (Thread.CurrentThread.ManagedThreadId == UnityThreadId)
     {
         action();
     }
     else
     {
         UnitySynchronizationContext.Post(state => action(), null);
     }
 }
예제 #6
0
 public static void RunOnUnityScheduler(Action action)
 {
     if (SynchronizationContext.Current == UnitySynchronizationContext)
     {
         action?.Invoke();
     }
     else
     {
         UnitySynchronizationContext.Post(_ => action?.Invoke(), null);
     }
 }
예제 #7
0
 private async Task ConnectAsTcpClient()
 {
     isRun             = true;
     tcpClient         = new TcpClient();
     tcpClient.NoDelay = true;
     try
     {
         await tcpClient.ConnectAsync("127.0.0.1", 8888);
     }
     catch (Exception e)
     {
         message.text = $"[控制器] 连接到播放器失败 {e}!";
         throw;
     }
     UnitySynchronizationContext.Post(() => message.text = "[控制器] 连接到播放器!");
     var _ = Task.Run(StreamReadHandleAsync);
 }
예제 #8
0
 void SendNetMessage(string str)
 {
     try
     {
         if (isRun)
         {
             var    networkStream = tcpClient.GetStream();
             var    data          = Encoding.UTF8.GetBytes(str);
             byte[] size          = BytesHelper.GetBytes((ushort)data.Length);
             var    temp          = new byte[size.Length + data.Length];
             Buffer.BlockCopy(size, 0, temp, 0, size.Length);
             Buffer.BlockCopy(data, 0, temp, size.Length, data.Length);
             networkStream.Write(temp, 0, temp.Length);
             networkStream.Flush();
             Debug.Log($"[控制器] 发送到播放器消息 {str}!");
             UnitySynchronizationContext.Post(() => { if (message)
                                                      {
                                                          message.text = $"[控制器] 发送到播放器消息 {str}!";
                                                      }
                                              });
         }
         else
         {
             Debug.LogWarning($"{nameof(PlayerController)}: 已经与服务器断开连接!");
         }
     }
     catch (Exception e)
     {
         UnitySynchronizationContext.Post(() => { if (message)
                                                  {
                                                      message.text = $"[控制器] 发送消息到播放器错误 {e}!";
                                                  }
                                          });
         throw;
     }
 }
예제 #9
0
 public override void OnCompleted(Action action) => context.Post(state => action(), null);
예제 #10
0
 private void ContextActivationEventHandler(object sender, EventArgs eventArgs)
 {
     context.Activated -= ContextActivationEventHandler;
     context.Post(state => continuation(), null);
 }