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);
        }

    }
}


运行效果:

 

 

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

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

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

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

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

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

 

 

第1章 C#入门 1.1 NET框架和C#语言简介 1.1.1 NET框架简介 1.1.2 认识C≠语言 1.2 Visual Studio.NET集成开发环境简介 1.2.1 VS.NET起始页 1.2.2 VS.NET集成开发环境 1.2.3 窗口布局调整 1.3 第一个控制台应用程序 1.3.1 案例说明 1.3.2 案例实现步骤 1.3.3 代码及分析 1.3.4 相关知识及注意事项 1.4 我的第一个Windows窗体应用程序 1.4.1 案例说明 1.4.2 案例实现步骤 1.4.3 代码及分析 1.4.4 相关知识及注意事项 1.5 本章小结 1.6 习题 第2章 C#语法基础 2.1 C#语言的数据类型 2.1.1 案例说明 2.1.2 代码及分析 2.1.3 相关知识及滓意事项 2.2 C#语言的运算符和表达式 2.2.1 案例说明 2.2.2 代码及分析 2.2.3 相关知识及注意事项 2.3 本章小结 2.4 习题 第3章 C#程序结构 3.1 顺序与选择结构 3.1.1 案例说明 3.1.2 代码及分析 3.1.3 相关知识及注意事项 3.2 选择结构的窗体应用 3.2.1 案例说明 3.2.2 案例实现步骤 3.2.3 代码及分析 3.2.4 相关知识及注意事项 3.3 while、do.while循环 3.3.1 案例说明 3.3.2 代码及分析 3.3.3 相关知识及注意事项 3.4 for循环 3.4.1 案例说明 3.4.2 代码及分析 3.4.3 相关知识及注意事项 3.5 本章小结 3.6 习题 第4章 方法 4.1 方法的定义与调用 4.1.1 案例说明 4.1.2 代码及分析 4.1.3 相关知识及注意事项 4.2 方法的嵌套调用 4.2.1 案例说明 4.2.2 代码及分析 4.2.3 相关知识及注意事项   …… 第5章 类与对象 第6章 数组和索引器 第7章 继承 第8章 多态 第9章 接口 第10章 异常处理 第11章 委托和事件 第12章 文件操作 第13章 课程设计 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值