Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите по архитектуре Socket сервера, Асинхронный сервер 
:(
    Опции темы
idevpao
Дата 23.5.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.5.2011

Репутация: нет
Всего: нет



Просмотрел много разного кода, в т.ч. на 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,
    }
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.