准备写一个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);
}
}
}
运行效果:
今天刚好到一个视频说到程序员等级标准,这里跟大家分享一下,如有不对,勿喷
初级:对代码不做任何封装,以实现业务为目的
中级:对代码进行封装,熟练使用继承、多态及面向对象思想
高级:可对程序进行设计并熟练使用设计模式进行编码
优秀高级:会考虑程序的可扩展性
架构师:不关注业务的实现。关注框架的搭建,需要将程序设计思想应用到抽象的框架中去