private void ServerThread() { //此服务同一时间只接受一个客户端的请求 1对1 byte[] received; while (!ClientConnected && !quit) { received = new byte[200]; try { conn = bluetoothListener.AcceptBluetoothClient();//等待客户端连接 } catch (Exception) { break; } stream = conn.GetStream(); Msg("客户端上线"); DeviceInfo("未知"); //首次连接等待客户端发送连接指令 stream.Read(received, 0, received.Length); String tmp = Encoding.UTF8.GetString(received); String str = "GamePadAndroid"; tmp = tmp.Substring(0, 14); //Msg(tmp); if (tmp != str) { Msg("未收到客户端对接指令或已断开连接"); if (stream != null) { stream.Close(); } if (conn != null) { conn.Close(); } continue; } else { DeviceInfo(tmp); //收到正确指令,发送确认报文 byte[] sent = Encoding.UTF8.GetBytes("GamePadPC"); stream.Write(sent, 0, sent.Length); //stream.Flush(); Msg("已连接"); ClientConnected = true; while (!quit) { try { //这一段基本没用,断开连接了也判断不出来 /**if (!conn.Connected || !stream.CanRead || !stream.CanWrite) * throw new IOException("client disconnect");*/ received = new byte[200]; stream.Read(received, 0, received.Length); String rec = Encoding.UTF8.GetString(received); String t = rec.Substring(0, 1); //客户端断开连接后会导致在缓冲区一直读空数据"\0" if (t == "\0") { throw new IOException("client disconnect"); } rec.TrimEnd('\0'); //todo 这里执行按键操作,后期用队列实现 if (t != "_" && running) { //Thread thread = new Thread(new ParameterizedThreadStart(Press.Run)); //thread.Start(rec); Press.Run(rec); } Msg(rec); } catch (IOException) { ClientConnected = false; Msg("客户端断开连接"); DeviceInfo("无连接"); new Task(() => { MethodInvoker methodInvoker = new MethodInvoker(() => { if (WindowState == FormWindowState.Minimized) { //弹出窗口 Run(); WindowState = FormWindowState.Normal; this.ShowInTaskbar = true; } }); this.BeginInvoke(methodInvoker); }).Start(); stream.Close(); conn.Close(); break; } } } } }