• 使用TcpClient的例程


    例子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
    ");
                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);
            }
            }
  • 相关阅读:
    linux中inittab文件详解
    Linux的 test 命令使用
    程序的链接和装入及Linux下动态链接的实现
    linux虚拟内存管理简要总结
    一些vim技巧和经验
    Linux cp mv rm ln 命令对于 inode 和 dentry 的影响
    Linux C编程一站式学习
    虚拟内存管理
    为何cp覆盖进程的动态库(so)会导致coredump
    linux下So覆盖导致coredump问题的分析
  • 原文地址:https://www.cnblogs.com/legion/p/9100347.html
Copyright © 2020-2023  润新知