1.蛮牛ARPG网络实战-客户端 服务端测试

版权声明:欢迎转载,转载请注明原博客链接:http://blog.csdn.net/u013108312 和本文章的链接。谢谢合作。作者:CircleGood https://blog.csdn.net/u013108312/article/details/70543911

本文固定链接:http://blog.csdn.net/u013108312/article/details/70543911

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
{
    class Program
    {
        private static Socket server;
        static void Main(string[] args)
        {
            //创建监听连接实例
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定监听地址及端口
            server.Bind(new IPEndPoint(IPAddress.Any,10001));
            //设置监听的等待队列长度并开启监听
            server.Listen(10);
            //无限循环,监听客户端的连接
            while (true) {
                //监听客户端连接,当有客户端连接的时候,返回连接的客户端的连接信息
                Socket client = server.Accept();
                Console.WriteLine("客户端接入");
                //监听客户端的消息
                receiveMessage(client);
            }
        }

        private static void receiveMessage(Socket client) {
            try
            {
                //创建消息接收缓冲数组
                byte[] buff = new byte[1024];
                //将消息读入缓冲区 并获取消息长度
                int size = client.Receive(buff);
                //打印收到的消息内容
                Console.WriteLine(client.RemoteEndPoint.ToString() + ":" + Encoding.UTF8.GetString(buff, 0, size));
                //尾递归 继续监听消息到来
                receiveMessage(client);
            }
            catch (Exception e) {
                Console.WriteLine("客户端断开");
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace client1
{
    class Program
    {
        private static Socket client;
        private static byte[] bytearray = new byte[1024];//消息接收缓冲区
        static void Main(string[] args)
        {
            //创建连接实例
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //连接到服务器
            client.Connect("127.0.0.1", 10001);
            //开启异步消息接收,将消息写入缓冲区
            client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
            //监听用户输入
            input();
        }
        private static void ReceiveCallBack(IAsyncResult result)
        {
            //获取连接实例
            Socket client = (Socket)result.AsyncState;
            try
            {
                //结束本次异步接收并获取消息长度
                int size = client.EndReceive(result);
                //打印收到的消息信息
                Console.WriteLine(Encoding.UTF8.GetString(bytearray, 0, size));
                //重新开启连接实例的异步接收
                client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
            }
            catch (Exception e)
            {
                Console.WriteLine("服务器把你踢了");
            }
        }

        private static void input() {
            //获取控制台输入的一行字符
            string txt = Console.ReadLine();
            //判断输入内容是否为空
            if (txt.Trim().Equals(string.Empty)) {
                //打印即将退出信息
                Console.WriteLine("按下任意键退出程序");
                //监听任意按键 跳出当前方法
                Console.Read();
                return;
            }
            //讲输入内容转换为byte数组
            byte[] bytearray= Encoding.UTF8.GetBytes(txt);
            //通过连接实例将转换后的内容 发送至服务器
            client.Send(bytearray);
            //尾递归,继续监听输入
            input();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Net;

namespace server2
{
    class Program
    {
        private static Socket server;
        private static Dictionary<Socket, byte[]> caches = new Dictionary<Socket, byte[]>();
        static void Main(string[] args)
        {
            //创建监听连接实例
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定监听地址及端口
            server.Bind(new IPEndPoint(IPAddress.Any,10001));
            //设置监听的等待队列长度并开启监听
            server.Listen(10);
            while (true) {
                //监听客户端连接,当有客户端连接的时候,返回连接的客户端的连接信息
                Socket client = server.Accept();
                Console.WriteLine("客户端接入");
                //为当前客户端创建消息接收缓冲区
                byte[] bytearray=new byte[1024];
                //将连接实例与缓冲区通过字典关联起来
                caches.Add(client, bytearray);
                //开启异步消息接收,将消息写入缓冲区
                client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
            }
        }

        private static void ReceiveCallBack(IAsyncResult result) {
            //获取当前消息的发送者的连接实例
            Socket client = (Socket)result.AsyncState;
            try
            {
                //结束本次异步接收并获取消息长度
                int size = client.EndReceive(result);
                //根据连接实例从字典中获取缓冲区
                byte[] bytearray = caches[client];
                //打印当前接收到的消息内容
                Console.WriteLine(client.RemoteEndPoint.ToString() + ":" + Encoding.UTF8.GetString(bytearray, 0, size));
                //将当前接收到的消息群发给当前服务器中的所有用户
                brocast(client.RemoteEndPoint.ToString() + ":" + Encoding.UTF8.GetString(bytearray, 0, size));
                //重新开启连接实例的异步接收
                client.BeginReceive(bytearray, 0, 1024, SocketFlags.None, ReceiveCallBack, client);
            }
            catch (Exception e) {
                //监听客户端断开后 从字典中移除对应的连接关联
                caches.Remove(client);
                Console.WriteLine("客户端断开连接");
            }
        }

        private static void brocast(string value) {
            //将需要发送的消息转换为byte数组
            byte[] bytearray = Encoding.UTF8.GetBytes(value);
            //通过循环遍历 获取当前所有的连接对象 依次发送消息
            foreach (Socket client in caches.Keys) {
                //将转换好的消息发送给当前获取的客户端
                client.Send(bytearray);            
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u013108312/article/details/70543911