Просмотрел много разного кода, в т.ч. на http://www.google.com/codesearch, но так для себя не понял, как отделить бизнес логику сервера от самой серверной части? Неужели обрабатывать приходящие данные в методе ReceiveCallback кейсом? А если надо запросы к базе данных сделать, дождаться ответа, сравнить с полученным у сервера данными и затем только отправить результат пользователю? Как вообще организуется непосредственно логика обработки на асинхронном сервере? Может книги какие есть специализированные для C#? Код моего сервера (пока без обработки ошибок и без всяческих проверок): Код | using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets;
namespace Sock { class TacticServer { private Socket _serverSocket; private List<ClientState> _userList = new List<ClientState>();
public TacticServer(string address, int port) { IPHostEntry host = Dns.GetHostEntry(address); // Dns.GetHostName() IPEndPoint endPoint = new IPEndPoint(host.AddressList[0], port);
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _serverSocket.Bind(endPoint); }
public void Start() { _serverSocket.Listen(1000);
Logout.ScreenOut(String.Format("Server started on {0}", _serverSocket.LocalEndPoint)); Logout.ScreenOut("Waiting for a connection...");
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); }
private void AcceptCallback(IAsyncResult result) { Socket resultSocket = (Socket)result.AsyncState; ClientState user = new ClientState(); user.socket = resultSocket.EndAccept(result);
lock (_userList) _userList.Add(user);
user.socket.BeginReceive(user.buffer, 0, user.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), user);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState); }
private void ReceiveCallback(IAsyncResult result) { ClientState user = result.AsyncState as ClientState;
int bytesRead = user.socket.EndReceive(result); StringBuilder content = new StringBuilder();
if (bytesRead > 0) { content.Append(Encoding.ASCII.GetString(user.buffer, 0, bytesRead)); // Бизнес-логика? //switch (...) //{ // case: // Вошел // break; // case: // Вышел // break; // //и т.д. //} }
user.socket.BeginReceive(user.buffer, 0, user.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), user); } }
class ClientState { public Socket socket = null; public const int BUFFER_SIZE = 1024; public byte[] buffer = new byte[BUFFER_SIZE]; public string name; }
static class Logout { public static void ScreenOut(string message) { Console.WriteLine(message); }
public static void FileOut(string message) {
} }
[Serializable] struct Message { public Command command; public string payload; }
public enum Command : int { Connect = 1, Disconnect = 2, Logon = 3, Logout = 4, } }
|
|