TCP 通信

        服务端使用System.Net.Sockets.TcpListener进行监听,客户端使用System.Net.Sockets.TcpClient进行连接。一旦连接建立,两者使用System.Net.Sockets.NetworkStream进行通信。

        TCP 允许两台电脑通过网络进行通信,是一种可靠的、面向连接的协议,它提供了内置的流控制、序列、错误处理。要创建一个TCP连接,必须有一台电脑充当服务器,并且监听一个具体的终结点(终结点是一个IP地址与端口号的组合)。另一台电脑充当客户端,发送连接请求到服务器正在监听的终结点。一旦建立了连接,两台电脑轮流交换信息。.NET通过抽象的流(Stream)使得这个过程变得简单了,两台电脑通过对System.Net.Sockets.NetworkStream的读、写操作来发送数据。

        在设计网络应用程序时,定义服务端和客户端用于通信的协议,是一个比较不错的想法。协议包括了一些所允许命令的常量,确保了应用程序代码中不会包含硬编码的通信字符串。这些常量编译为单独的类库程序集,必须被服务端和客户端引用。

    public class SocketProtocol
    {
        public const string AcknowledgeOK = "确定连接";
        public const string AcknowledgeCancel = "取消连接";
        public const string Disconnect = "断开连接";
        public const string RequestConnect = "请求连接";
    }

TCP 服务端的代码:

        static void Main(string[] args)
        {
            //创建监听器
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8000);
            Console.WriteLine("即将初始化端口");
            listener.Start();
            Console.WriteLine("监听连接");

            try
            {
                //等待连接请求并返回TcpClient
                using (TcpClient client = listener.AcceptTcpClient())
                {
                    Console.WriteLine("接受连接");
                    //获取网络流
                    NetworkStream stream = client.GetStream();
                    //创建BinaryWriter写入流
                    using (BinaryWriter w = new BinaryWriter(stream))
                    {
                        //创建BinaryReader读取流
                        using (BinaryReader r = new BinaryReader(stream))
                        {
                            if (r.ReadString() == SocketProtocol.RequestConnect)
                            {
                                w.Write(SocketProtocol.AcknowledgeOK);
                                Console.WriteLine("连接完成");

                                while (r.ReadString() != SocketProtocol.Disconnect)
                                {

                                }
                                Console.WriteLine(Environment.NewLine);
                                Console.WriteLine("收到断开连接请求");
                            }
                            else
                            {
                                Console.WriteLine("不能完成连接");
                            }
                        }
                    }
                }
                Console.WriteLine("连接关闭");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                //关闭底层的Socket(停止监听新的请求)
                listener.Stop();
                Console.WriteLine("监听器停止");
            }

            Console.WriteLine(Environment.NewLine);
            Console.ReadLine();
        }

TCP客户端的代码:

        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();

            try
            {
                Console.WriteLine("尝试连接服务器");
                client.Connect(IPAddress.Parse("127.0.0.1"), 8000);
                Console.WriteLine("已建立连接");

                NetworkStream stream = client.GetStream();
                using (BinaryWriter w = new BinaryWriter(stream))
                {
                    using (BinaryReader r = new BinaryReader(stream))
                    {
                        //开始对话
                        w.Write(SocketProtocol.RequestConnect);

                        if (r.ReadString() == SocketProtocol.AcknowledgeOK)
                        {
                            Console.WriteLine("已连接");
                            Console.WriteLine("按下Enter键断开连接");
                            Console.ReadLine();
                            Console.WriteLine("连接断开...");
                            w.Write(SocketProtocol.Disconnect);
                        }
                        else
                        {
                            Console.WriteLine("连接未完成");
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                //关闭连接Socket
                client.Close();
                Console.WriteLine("端口已关闭");
            }
            Console.WriteLine(Environment.NewLine);
            Console.ReadLine();
        }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值