C#网络编程日记2

一,tcp协议

Tcp程序有服务器端和可客户端,服务器端通常在一个众所周知的地址监听对服务的请求,就是说服务器处于休眠状态,知道客户端对服务器提出了连接请求。


Server端程序执行步骤如下:

1.打开一个通信通道,并告知本地主机,他愿意在某一地址和端口上接收客户连接请求。

2.等待客户请求到达该端口。

3.接收到重复服务请求,处理该请求并发出应答信号。接收到并发服务请求,激活一个新的进程或者线程来处理这个客户请求。新进程或者线程处理此客户请求,并不需要对其他请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。

4.返回第二步,等待另一客户请求。

5.关闭服务器。


Client端程序执行步骤如下:

1.打开一个通信通道,并连接到服务器所在主机的特定端口。

2.向服务器发服务请求报文,等待并接受应答,继续提出请求。

3.请求结束后关闭通信通道并终止。


套接字工作原理:

1.服务器套接字监听全网

2.客户端套接字向服务端套接字发出连接请求。

3.当服务器端监听到客户端套接字的连接请求时,他就响应客户端套接字请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一点客户端确认了此描述,连接就建立好了。而服务器端始终处于监听状态,继续接受其他客户端套接字的连接请求。



使用socket实现tcp程序:

服务器端:

        public Form1()
        {
            InitializeComponent();
            //IPAddress监听所有地址
            IPEndPoint localIPEndPoint = new IPEndPoint(IPAddress.Any, 6001);
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(localIPEndPoint);
            serverSocket.Listen(10);

            while (true)
            {
                //在accept处等待客户端的connect
                clientSocket = serverSocket.Accept();

                Thread receiveThread = new Thread(receiveData);
                receiveThread.Start();

                Thread sendThread = new Thread(sendData);
                sendThread.Start();
            }
        }

        private void sendData()
        {
            byte[] buffer = new byte[2];
            buffer = Encoding.UTF8.GetBytes("owen");
            clientSocket.Send(buffer,buffer.Length,SocketFlags.None);
        }

        private void receiveData()
        {
            byte[] buffer = new byte[2048];
           //在receive处等待客户端发送信息过来 
            int len = clientSocket.Receive(buffer);
            string message = Encoding.UTF8.GetString(buffer,0,len);
            
        }

客户端:

        private Socket clientSocket;
        public Form1()
        {
            InitializeComponent();
            //这里的ipEndPoint是服务器端的ip和port
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("10.131.38.79"),6001);
            clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //connect用于发起连接客户端
            clientSocket.Connect(ipEndPoint);
            Thread receiveThread = new Thread(receiveData);
            receiveThread.Start();

            Thread sendThread = new Thread(sendData);
            sendThread.Start();
            
        }
        private void sendData()
        {
            //当这里发送了信息,服务端的receiveData就能接收信息
            byte[] buffer = new byte[2048];
            buffer = Encoding.UTF8.GetBytes("welcome");
            clientSocket.Send(buffer, buffer.Length, SocketFlags.None);
        }

        private void receiveData()
        {
            byte[] buffer = new byte[2048];
            int len = clientSocket.Receive(buffer);
            string message = Encoding.UTF8.GetString(buffer, 0, len);
            
        }

另一种简便的Tcp编程方法——TcpListener和TcpClient

服务器端:

        private NetworkStream netStream;
        private TcpClient tcpClient;
        private BinaryReader reader;

        public Form1()
        {
            InitializeComponent();
            
            TcpListener tcpListener = new TcpListener(IPAddress.Any, 13000);
            tcpListener.Start();

            while(true)
            {
                tcpClient = tcpListener.AcceptTcpClient();

                Thread receiveThread = new Thread(receiveData);
                receiveThread.Start();

                //Thread sendThread = new Thread(sendData);
                //sendThread.Start();
            }
        }

        private void receiveData()
        {
            netStream = tcpClient.GetStream();
            reader = new BinaryReader(netStream);
            string receivemessage = reader.ReadString();
            Console.WriteLine("message ="+receivemessage);
        }

客户端:

        private TcpClient tcpClient;
        private NetworkStream netStream;
        private BinaryWriter writer;

        public Form1()
        {
            InitializeComponent();

            tcpClient = new TcpClient();
            tcpClient.Connect(IPAddress.Parse("10.131.38.79"), 13000);

            Thread sendThread = new Thread(sendData);
            sendThread.Start();
        }

        private void sendData()
        {
            netStream = tcpClient.GetStream();
            writer = new BinaryWriter(netStream);
            writer.Write("welcome");
        }



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值