Server Message - 服务器异步消息接收 基础(四)

当处理完了一个消息以后,但是只能一条一条的 发送和接收,这里如果说想要无限的发送或者说无限的接收
这里的话就是两种处理的方式:
1、开始一条新的线程
2、使用BeginAccept
客户端向服务器发送消息以后,服务器端需要不断的接收消息,如果想要持续不断的接收消息,那么就不再是 关闭 Socket了,如果关闭了话 就无法进行正常的持续接收了
使用 BeginReceive()方法进行,BeginReceive()方法和 Receive() 方法的区别在于,BeginReceive()方法是异步的进行接收数据,首先是需要一个 byte[] 数组进行接收,然后是一个标志,最后就是 一个 回调函数,因为 调用Receive()方法的话 程序会进行一个暂停,这里也就是 同步里边的方法,BeginReceive()的话就是接收到了消息以后使用那个方法进行处理,通过事件的方式,当服务器端接收到了 一个请求以后,会调用一个事件方法进行处理,so 定义一个方法,传递一个 参数,这个参数的作用:当接收到了 数据的时候,会调用一个方法,通过参数进行传递
接收的话 直接 使用转型的 方式进行一个接收
//转型
Socket clientSocket = ar.AsyncState as Socket;
返回为 object,传递的也是 object
再往下面就是 使用 EndReceive()方法完成数据的接收 ,有一个 int 的返回类型,代表了返回多少字节的数据,数据存储到了数组中。接着就是 UTF-8 进行反编码。得到一个字符串儿,然后进行输出即可。
因为调用完了 BeginReceive()方法以后不会影响后面的逻辑
调用完了 以后只会完成一条消息的接收,如果想要循环的接收消息的话,直接在 事件方法中进行 回调 Begin方法。

如果说想在客户端进行一个循环发送的话,直接在 客户端那边儿将 输入的东西 套一个 while()循环即可。

服务器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Server_Message_ServerEnd
{
    class Program
    {
        static void Main(string[] args)
        {
            StartServerAsync();
            Console.ReadKey();
        }



        /// <summary>
        /// 同步
        /// </summary>
        private void StartServerSync()
        {
            //创建 Socket,使用流的方式
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //申请端口,绑定 IP 局域网 IP 192.168.0.110(动态变化)    127.0.0.1(本机)
            string Ip = "192.168.0.110";
            int endPoint = 8089;
            IPAddress serverIP = IPAddress.Parse(Ip);
            IPEndPoint serverEndPoint = new IPEndPoint(serverIP, endPoint);
            //绑定 ip 和端口号 (申请固定的 IP 和 端口号)
            serverSocket.Bind(serverEndPoint);
            //监听、最多为 10 个 、 0 为不限制
            serverSocket.Listen(10);
            //接受一个客户端的连接,返回 Socket 对象
            Socket clientScoket = serverSocket.Accept();


            //考虑到有中文,所以需要使用编码的形式
            string msg = "Hello Client,你好";
            //转换 字符串传递
            byte[] data = Encoding.UTF8.GetBytes(msg);
            clientScoket.Send(data);


            //存储数据、1024 几十个字符都可以存下
            byte[] dataBuffer = new byte[1024];
            //接收到的数据
            int count = clientScoket.Receive(dataBuffer);
            //转变编码格式
            string messageReceive = Encoding.UTF8.GetString(dataBuffer, 0, count);
            Console.WriteLine(messageReceive);

            Console.ReadKey();
            //关闭客户端、客户端的连接
            clientScoket.Close();

            serverSocket.Close();
        }

        
        /// <summary>
        /// 异步
        /// </summary>
        private static void StartServerAsync()
        {
            //创建 Socket,使用流的方式
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //申请端口,绑定 IP 局域网 IP 192.168.0.110(动态变化)    127.0.0.1(本机)
            string Ip = "192.168.0.110";
            int endPoint = 8089;
            IPAddress serverIP = IPAddress.Parse(Ip);
            IPEndPoint serverEndPoint = new IPEndPoint(serverIP, endPoint);
            //绑定 ip 和端口号 (申请固定的 IP 和 端口号)
            serverSocket.Bind(serverEndPoint);

            Console.WriteLine("服务器启动成功...");

            //监听、最多为 10 个 、 0 为不限制
            serverSocket.Listen(10);
            //接受一个客户端的连接,返回 Socket 对象
            clientScoket = serverSocket.Accept();
            

            //考虑到有中文,所以需要使用编码的形式
            string msg = "Hello Client,你好";
            //转换 字符串传递
            byte[] data = Encoding.UTF8.GetBytes(msg);
            clientScoket.Send(data);



            //异步接收、监听客户端数据传递
            clientScoket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientScoket);
            //不会影响下边的执行
        }

        static Socket clientScoket;
        static byte[] dataBuffer = new byte[1024];
        static void ReceiveCallBack(IAsyncResult ar)
        {
            //转型
            Socket clientSocket = ar.AsyncState as Socket;
            //接收了 多少字节的数据、数据存储到了 数组中
            int count = clientSocket.EndReceive(ar);
            string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);
            Console.WriteLine("从客户端接收到了数据" + msg);
            clientScoket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientScoket);
        }
    }
}

客户端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Server_Message_ClientEnd
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建 Socket
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //建立连接、指定终端
            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.110"), 8089));

            //接收消息的数组
            byte[] data = new byte[1024];
            //接收服务器的消息
            int count= clientSocket.Receive(data);
            //数组转换信息
            string msg = Encoding.UTF8.GetString(data, 0, count);
            Console.WriteLine(msg);

            while (true)
            {
                //发送消息到服务器
                string s = Console.ReadLine();
                //转换
                clientSocket.Send(Encoding.UTF8.GetBytes(s));

            }


            Console.ReadKey();
            clientSocket.Close();
            
        }

       
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值