使用软件工具实现案例

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

 

首先:头脑风暴一下



 

 

第二:设计软件原型



 

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



 

第四:设计数据表结构



 

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

 

 

Demo.Library

 

[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace Demo.Library  
  8. {  
  9.     public class Config  
  10.     {  
  11.         public string IP { getset; }  
  12.   
  13.         public int Port { getset; }  
  14.     }  
  15. }  

Demo.Server

 

 

[csharp] view plain copy
 
  1. using Demo.Library;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Net;  
  6. using System.Net.Sockets;  
  7. using System.Text;  
  8. using System.Threading;  
  9. using System.Threading.Tasks;  
  10.   
  11. namespace Demo.Server  
  12. {  
  13.   
  14.     public class ServerSocket  
  15.     {  
  16.   
  17.         readonly Config _config;  
  18.         static List<Socket> _clients;  
  19.         static Socket serverSocket;  
  20.         public event EventHandler<string> ReceiveMessageEvent;  
  21.   
  22.         public event EventHandler<string> StartEvent;  
  23.   
  24.         public ServerSocket(Config config)  
  25.         {  
  26.             _config = config;  
  27.             _clients = new List<Socket>();  
  28.         }  
  29.   
  30.         public void Start()  
  31.         {  
  32.             IPAddress ip = IPAddress.Parse(_config.IP);  
  33.             serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  34.             serverSocket.Bind(new IPEndPoint(ip, _config.Port));  
  35.             serverSocket.Listen(10);  
  36.             Task.Run(() =>  
  37.             {  
  38.                 ListenClientConnect();  
  39.             });  
  40.   
  41.             
  42.             StartEvent(this"Server启动成功");  
  43.         }  
  44.         private void ListenClientConnect()  
  45.         {  
  46.             while (true)  
  47.             {  
  48.                 Socket clientSocket = serverSocket.Accept();  
  49.                 _clients.Add(clientSocket);  
  50.   
  51.                 Task.Run(() =>  
  52.                 {  
  53.                     ReceiveMessage(clientSocket);  
  54.                 });  
  55.             }  
  56.         }  
  57.   
  58.         private void ReceiveMessage(Socket client)  
  59.         {  
  60.             while (true)  
  61.             {  
  62.   
  63.                 byte[] result = new byte[client.ReceiveBufferSize];  
  64.                 client.Receive(result);  
  65.                 ReceiveMessageEvent(client, Encoding.UTF8.GetString(result));  
  66.             }  
  67.         }  
  68.   
  69.         public List<Socket> All()  
  70.         {  
  71.             return _clients;  
  72.         }  
  73.   
  74.     }  
  75.   
  76.     public static class Extend  
  77.     {  
  78.         public static async void Send(this List<Socket> clients, string message)  
  79.         {  
  80.             var factory = new TaskFactory();  
  81.   
  82.             List<Task> tasks = new List<Task>();  
  83.             clients.ForEach(p =>  
  84.             {  
  85.                 tasks.Add(factory.StartNew(() =>  
  86.                {  
  87.                    p.Send(Encoding.UTF8.GetBytes(message));  
  88.                }));  
  89.             });  
  90.   
  91.             await factory.ContinueWhenAll(tasks.ToArray(), (p) => { });  
  92.         }  
  93.     }  
  94. }  
 
[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. namespace Demo.Server  
  12. {  
  13.     public partial class Form1 : Form  
  14.     {  
  15.         public Form1()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.         ServerSocket serverSocket;  
  20.         private void btnStart_Click(object sender, EventArgs e)  
  21.         {  
  22.             serverSocket = new ServerSocket(new Library.Config  
  23.             {  
  24.                 IP = "127.0.0.1",  
  25.                 Port = Int32.Parse(txtPort.Text)  
  26.             });  
  27.             serverSocket.StartEvent += ServerSocket_StartEvent;  
  28.             serverSocket.ReceiveMessageEvent += ServerSocket_ReceiveEvent;  
  29.             serverSocket.Start();  
  30.         }  
  31.   
  32.         private void ServerSocket_StartEvent(object sender, string e)  
  33.         {  
  34.             MessageBox.Show(e);  
  35.         }  
  36.   
  37.         private void ServerSocket_ReceiveEvent(object sender, string e)  
  38.         {  
  39.             txtAll.Invoke(new Action(() => {  
  40.                 txtAll.Text += "\r\n来自客户端:" + e;  
  41.             }));  
  42.         }  
  43.   
  44.         private void btnSend_Click(object sender, EventArgs e)  
  45.         {  
  46.             serverSocket.All().Send(txtMsg.Text);  
  47.         }  
  48.     }  
  49. }  

Demo.Client

 

 

[csharp] view plain copy
 
  1. using Demo.Library;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Net;  
  6. using System.Net.Sockets;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9.   
  10. namespace Demo.Client  
  11. {  
  12.     public class ClientSocket  
  13.     {  
  14.         readonly Config _config;  
  15.   
  16.         static Socket clientSocket;  
  17.   
  18.         public event EventHandler<string> ReceiveMessageEvent;  
  19.   
  20.         public event EventHandler<string> ConnectEvent;  
  21.         public ClientSocket(Config config)  
  22.         {  
  23.             _config = config;  
  24.         }  
  25.   
  26.   
  27.         public void Connect()  
  28.         {  
  29.             IPAddress ip = IPAddress.Parse(_config.IP);  
  30.             clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  31.             clientSocket.Connect(new IPEndPoint(ip, _config.Port));  
  32.             ConnectEvent(this"连接服务器成功");  
  33.             Task.Run(() =>  
  34.             {  
  35.                 ReceiveMessage();  
  36.             });  
  37.   
  38.         }  
  39.   
  40.         public void ReceiveMessage()  
  41.         {  
  42.             while (true)  
  43.             {  
  44.                 byte[] result = new byte[clientSocket.ReceiveBufferSize];  
  45.                 clientSocket.Receive(result);  
  46.                 ReceiveMessageEvent(this, Encoding.UTF8.GetString(result));  
  47.             }  
  48.         }  
  49.         public void SendMessage(string message)  
  50.         {  
  51.             clientSocket.Send(Encoding.UTF8.GetBytes(message));  
  52.         }  
  53.     }  
  54. }  
 
[csharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. namespace Demo.Client  
  12. {  
  13.     public partial class Form1 : Form  
  14.     {  
  15.         public Form1()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.         ClientSocket clientSocket;  
  20.         private void btnStart_Click(object sender, EventArgs e)  
  21.         {  
  22.             clientSocket = new ClientSocket(new Library.Config  
  23.             {  
  24.                 IP = "127.0.0.1",  
  25.                 Port = Int32.Parse(txtPort.Text)  
  26.             });  
  27.             clientSocket.ConnectEvent += ClientSocket_ConnectEvent;  
  28.             clientSocket.ReceiveMessageEvent += ClientSocket_ReceiveMessageEvent;  
  29.             clientSocket.Connect();  
  30.         }  
  31.   
  32.         private void ClientSocket_ReceiveMessageEvent(object sender, string e)  
  33.         {  
  34.             txtAll.Invoke(new Action(() => {  
  35.                 txtAll.Text += "\r\n来自服务端:" + e;  
  36.             }));  
  37.             
  38.         }  
  39.   
  40.         private void ClientSocket_ConnectEvent(object sender, string e)  
  41.         {  
  42.             MessageBox.Show(e);  
  43.         }  
  44.   
  45.         private void btnSend_Click(object sender, EventArgs e)  
  46.         {  
  47.             clientSocket.SendMessage(txtMsg.Text);  
  48.         }  
  49.   
  50.     }  
  51. }  

运行效果:



 

 

 

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

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

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

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

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

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

上一专辑:Visio2013-UML类图下一张专辑:Jenkins+SVN自动编译发布Net项目 返回首页
本网站部分图片从互联网取得,如有侵权,请迅联系站长删除,谢谢
     ©2019 ohyewang 联系我们邮箱:marshal@ohyewang.com 京ICP备15001254号-1