private void _ReceiveTcp(IAsyncResult ar) { TcpRecvObj obj = (TcpRecvObj)ar.AsyncState; SocketError err; int read_size = obj.Client.Client.EndReceive(ar, out err); if (err == SocketError.Success) { if (read_size > 0) { //byte buffer轉 unicode 時要這樣處理, //不然buffer裡的空字元 0x00 會在unicode顯示 \0\0\0\0 string msg = Encoding.ASCII.GetString(obj.Buffer).TrimEnd('\0'); UpdateTextbox(textBox1, msg); //讀取完資料記得把buffer清一清 Array.Clear(obj.Buffer, 0, obj.Buffer.Length); } //如果連線沒斷掉就繼續呼叫AsyncReceive讀下一筆 if (obj.Client.Client.Connected) { obj.Client.Client.BeginReceive(obj.Buffer, 0, obj.Buffer.Length, SocketFlags.None, _ReceiveTcp, obj); } } }
private void _AcceptTcpClient(IAsyncResult ar) { try { TcpClient client = Listener.EndAcceptTcpClient(ar); TcpRecvObj obj = new TcpRecvObj() { Client = client, Buffer = new byte[256], }; //不走TcpClient,用更底層的Socket直接讀 client.Client.BeginReceive(obj.Buffer, 0, obj.Buffer.Length, SocketFlags.None, _ReceiveTcp, obj); Listener.BeginAcceptTcpClient(_AcceptTcpClient, null); } catch (Exception ex) { } }