例子1:
///假定一切工作正常
///連接后發送一次消息,然后不停接受消息並且打印
主要API說明
TcpClient client=new TcpClient();
client.Connect("127.0.0.1",8888);
NetworkStream stream=client.GetStream();
發送:
stream.Write(outBound, 0, outBound.Length);
接受:在另外一個線程,不停的
stream.Read(recvData, 0, bufSize);
class Program { byte[] recvData = new byte[1024 * 10]; TcpClient client = new TcpClient(); NetworkStream stream = null; void doWork() { client.Connect("127.0.0.1", 8888); stream = client.GetStream(); Thread th = new Thread(recv); th.Start(); byte[] outBound = Encoding.ASCII.GetBytes("Hello,this is one client\r\n"); stream.Write(outBound, 0, outBound.Length); stream.Flush(); } static void Main(string[] args) { Program p = new Program(); p.doWork(); } public void recv() { while (true) { int bufSize = client.ReceiveBufferSize; int count=stream.Read(recvData, 0, bufSize); string str = Encoding.ASCII.GetString(recvData, 0, count); Console.WriteLine(str); } } }
例子2:
使用異步,連接異步,發送異步,接受異步
關鍵API
注意這三者異步回調 委托類型
以下例子會提示連接失敗的情況,連接后,接受到消息就打印。
class Program { byte[] recvData = new byte[1024 * 10]; TcpClient client = new TcpClient(); NetworkStream stream = null; void doWork() { Console.WriteLine("preparing to connect in main thread " + Thread.CurrentThread.ManagedThreadId); client.BeginConnect("127.0.0.1", 8888,ConnectCallBack, client); } static void Main(string[] args) { Program p = new Program(); p.doWork(); Console.Read(); } private void ConnectCallBack(IAsyncResult result) { Console.WriteLine("well, i am in the connect thread..." + Thread.CurrentThread.ManagedThreadId); TcpClient client = result.AsyncState as TcpClient; try { client.EndConnect(result); } catch (Exception ex) { Console.WriteLine("well, seems an error occured..."); Console.WriteLine("which is " + ex.ToString()); return; } Console.WriteLine("Hooray, it worked."); client.Client.BeginReceive(recvData, 0, recvData.Length,SocketFlags.None, RecvCallBack, client); } public void RecvCallBack(IAsyncResult result) { Console.WriteLine("here in recv callback thread.." + Thread.CurrentThread.ManagedThreadId); int count = -1; try { count = client.Client.EndReceive(result); } catch (Exception ex) { Console.WriteLine("遠程計算機關閉"); return; } //an recv is done,display it and continue.. string msg = Encoding.ASCII.GetString(recvData, 0, count); Console.WriteLine("your recv this time is:"); Console.WriteLine(msg); client.Client.BeginReceive(recvData, 0, recvData.Length, SocketFlags.None, RecvCallBack, client); } }