C#面向对象设计及软件设计

准备写一个Socket案例,以面向对象思想设计


首先:头脑风暴一下



第二:设计软件原型


第三:设计类对象关系-ER图


第四:设计数据库表结构


第五:开始编码,解决方案如下:



Demo.Library

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

namespace Demo.Library
{
    public class Config
    {
        public string IP { get; set; }

        public int Port { get; set; }
    }
}

Demo.Server

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

namespace Demo.Server
{

    public class ServerSocket
    {

        readonly Config _config;
        static List<Socket> _clients;
        static Socket serverSocket;
        public event EventHandler<string> ReceiveMessageEvent;

        public event EventHandler<string> StartEvent;

        public ServerSocket(Config config)
        {
            _config = config;
            _clients = new List<Socket>();
        }

        public void Start()
        {
            IPAddress ip = IPAddress.Parse(_config.IP);
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(new IPEndPoint(ip, _config.Port));
            serverSocket.Listen(10);
            Task.Run(() =>
            {
                ListenClientConnect();
            });

          
            StartEvent(this, "Server启动成功");
        }
        private void ListenClientConnect()
        {
            while (true)
            {
                Socket clientSocket = serverSocket.Accept();
                _clients.Add(clientSocket);

                Task.Run(() =>
                {
                    ReceiveMessage(clientSocket);
                });
            }
        }

        private void ReceiveMessage(Socket client)
        {
            while (true)
            {

                byte[] result = new byte[client.ReceiveBufferSize];
                client.Receive(result);
                ReceiveMessageEvent(client, Encoding.UTF8.GetString(result));
            }
        }

        public List<Socket> All()
        {
            return _clients;
        }

    }

    public static class Extend
    {
        public static async void Send(this List<Socket> clients, string message)
        {
            var factory = new TaskFactory();

            List<Task> tasks = new List<Task>();
            clients.ForEach(p =>
            {
                tasks.Add(factory.StartNew(() =>
               {
                   p.Send(Encoding.UTF8.GetBytes(message));
               }));
            });

            await factory.ContinueWhenAll(tasks.ToArray(), (p) => { });
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Demo.Server
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        ServerSocket serverSocket;
        private void btnStart_Click(object sender, EventArgs e)
        {
            serverSocket = new ServerSocket(new Library.Config
            {
                IP = "127.0.0.1",
                Port = Int32.Parse(txtPort.Text)
            });
            serverSocket.StartEvent += ServerSocket_StartEvent;
            serverSocket.ReceiveMessageEvent += ServerSocket_ReceiveEvent;
            serverSocket.Start();
        }

        private void ServerSocket_StartEvent(object sender, string e)
        {
            MessageBox.Show(e);
        }

        private void ServerSocket_ReceiveEvent(object sender, string e)
        {
            txtAll.Invoke(new Action(() => {
                txtAll.Text += "\r\n来自客户端:" + e;
            }));
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            serverSocket.All().Send(txtMsg.Text);
        }
    }
}

Demo.Client

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

namespace Demo.Client
{
    public class ClientSocket
    {
        readonly Config _config;

        static Socket clientSocket;

        public event EventHandler<string> ReceiveMessageEvent;

        public event EventHandler<string> ConnectEvent;
        public ClientSocket(Config config)
        {
            _config = config;
        }


        public void Connect()
        {
            IPAddress ip = IPAddress.Parse(_config.IP);
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(new IPEndPoint(ip, _config.Port));
            ConnectEvent(this, "连接服务器成功");
            Task.Run(() =>
            {
                ReceiveMessage();
            });

        }

        public void ReceiveMessage()
        {
            while (true)
            {
                byte[] result = new byte[clientSocket.ReceiveBufferSize];
                clientSocket.Receive(result);
                ReceiveMessageEvent(this, Encoding.UTF8.GetString(result));
            }
        }
        public void SendMessage(string message)
        {
            clientSocket.Send(Encoding.UTF8.GetBytes(message));
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Demo.Client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        ClientSocket clientSocket;
        private void btnStart_Click(object sender, EventArgs e)
        {
            clientSocket = new ClientSocket(new Library.Config
            {
                IP = "127.0.0.1",
                Port = Int32.Parse(txtPort.Text)
            });
            clientSocket.ConnectEvent += ClientSocket_ConnectEvent;
            clientSocket.ReceiveMessageEvent += ClientSocket_ReceiveMessageEvent;
            clientSocket.Connect();
        }

        private void ClientSocket_ReceiveMessageEvent(object sender, string e)
        {
            txtAll.Invoke(new Action(() => {
                txtAll.Text += "\r\n来自服务端:" + e;
            }));
          
        }

        private void ClientSocket_ConnectEvent(object sender, string e)
        {
            MessageBox.Show(e);
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            clientSocket.SendMessage(txtMsg.Text);
        }

    }
}

运行效果:



今天刚好到一个视频说到程序员等级标准,这里跟大家分享一下,如有不对,勿喷

初级:对代码不做任何封装,以实现业务为目的

中级:对代码进行封装,熟练使用继承、多态及面向对象思想

高级:可对程序进行设计并熟练使用设计模式进行编码

优秀高级:会考虑程序的可扩展性

架构师:不关注业务的实现。关注框架的搭建,需要将程序设计思想应用到抽象的框架中去



猜你喜欢

转载自blog.csdn.net/xiaoxionglove/article/details/78005875