- Server:创建TCP的socket,监听客户端的连接。当一个客户端连接server的时候,server会单独创建一个client用来维护跟某一个客户端的连接,进行一个收发消息。client会有多个,一个客户端对应一个client,所以说后续不同的请求是通过client来调用controller进行处理。server会对client做一个管理,管理所里客户端的连接(为了优化对数据库的访问速度我们创建多个连接,如果只使用一个连接所有客户端都用一个连接查询起来就会慢,所以我们创建多个连接,一个client一个controller,connHelper放到client这边。)client会通过ConnHelper去建立一个连接,这样的话一个客户端就是一个连接,当客户端不需要的时候我们就对它进行一个销毁,跟数据库的连接也销毁掉。我们每次来一个请求client会去调用controller,controller会去调用DAO,接着DAO会去操作有需要跟数据库操作的话会操作数据库。(DAO有需要跟数据库做连接的时候就会从client这边来进行取得跟客户端的连接就是mysqlconnection)
- Controller:用来处理客户端的请求的,发送到server,server会调用相应的controller来进行处理。controller有很多个,处理不同的客户端的连接和请求。在处理的过程中可能涉及到数据库相关,就是DAO层交互。
- DAO:data access object,数据访问对象是一个面向对象的数据库接口。其实就是用来操作数据库的。DAO层要处理数据库要和两类打交道,一类是Model;另一类是ConnHelper。
- Model:就是模型——数据库模型。跟我们数据库里的表是对应着的,一个model类对应一个数据库表。
- ConnHelper:工具类,用来连接数据库的,建立mysqlConnect 。
1 using System.Net; 2 using System.Net.Sockets; 3 4 namespace Client.Server 5 { 6 class Server 7 { 8 //定义一些变量存储一些东西 9 private IPEndPoint _ipEndPoint; 10 private Socket serverSocket; 11 private List<Client> clientList;//把所有的客户端都管理起来,创建一个list集合 12 //给他提供一个空的构造方法,后期进行一个设置 13 public Server() 14 {} 15 //给他提供一个带参数的构造方法,我们开启服务端的时候需要ip和端口号。 16 public Server(string ipStr,int port) 17 { 18 SetIpAndPort(ipStr,port); 19 } 20 //set方法设置IP和端口号 21 public void SetIpAndPort(string ipStr,int port) 22 { 23 _ipEndPoint = new IPEndPoint(IPAddress.Parse(ipStr), port); 24 } 25 //进行启动server端,启动监听 26 public void Start() 27 { 28 serverSocket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 29 serverSocket.Bind(_ipEndPoint); 30 serverSocket.Listen(0); 31 serverSocket.BeginAccept(AcceptCallBack, null) ; 32 } 33 //使用异步的方式调用多个客户端的连接 34 private void AcceptCallBack(IAsyncResult ar) 35 { 36 Socket clientSocket = serverSocket.EndAccept(ar);//得到跟客户端的连接,接收到客户端的连接 37 Client client = new Client(clientSocket,this); 38 client.Start(); 39 clientList.Add(client); 40 41 } 42 public void RemoveClient(Client client) 43 { 44 //多个客户端可能都要去访问clientList去进行移除,把他锁定了之后再进行移除,防止多线程同时访问共享的clientList矛盾异常 45 lock (clientList) 46 { 47 clientList.Remove(client); 48 49 } 50 51 } 52 } 53 }
using System.Net.Sockets; namespace Client.Server { //专门用来处理与客户端的通信问题 class Client { private Socket clientSocket; private Server server;//这边可能会与server交互,也需要持有一下 //给他提供一个空的构造方法,后期进行一个设置 public Client(){} public Client(Socket clientSocket, Server server) { this.clientSocket = clientSocket; this.server = server; } //表示开启监听 public void Start() { clientSocket.BeginReceive(null,0,0,SocketFlags.None,ReceiveCallBack,null); } private void ReceiveCallBack(IAsyncResult ar) { try { int count = clientSocket.EndReceive(ar);//首先要接收数据的长度 if (count == 0) { Close(); } //todo 处理接收到的数据 Start(); } catch (Exception e) { Console.WriteLine(e); Close(); } } //专门断开连接的方法 private void Close() { if(clientSocket != null) clientSocket.Close(); server.RemoveClient(this); } } }
标签:架构,server,client,Server,连接,clientSocket,客户端 From: https://www.cnblogs.com/siki2017/p/18331566