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); } }); } }
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; } }
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; } }
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); } }
public static void RunOnUnityScheduler(Action action) { if (SynchronizationContext.Current == UnitySynchronizationContext) { action?.Invoke(); } else { UnitySynchronizationContext.Post(_ => action?.Invoke(), null); } }
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); }
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; } }
public override void OnCompleted(Action action) => context.Post(state => action(), null);
private void ContextActivationEventHandler(object sender, EventArgs eventArgs) { context.Activated -= ContextActivationEventHandler; context.Post(state => continuation(), null); }