Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты SilverLight, как? 
:(
    Опции темы
WERITAS
Дата 21.7.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

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



Кто-нибудь работал с сокетами в Silverlight? Сделал одну тестовую программу, не получается подконнектиться к веб-серверу

Код

internal sealed class SocketClient : IDisposable
    {
        private const int Receive = 1;
        private const int Send = 0;

        private bool isConnected = false;

        private Socket socket;
        private DnsEndPoint endPoint;

        private static AutoResetEvent autoEvent = new AutoResetEvent(false);
        private static AutoResetEvent[] autoSendReceiveEvents = new AutoResetEvent[2] { new AutoResetEvent(false), new AutoResetEvent(false) };


        internal SocketClient(string host, int port)
        {
            endPoint = new DnsEndPoint(host, port);
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }


        internal void Connect()
        {
            SocketAsyncEventArgs args = new SocketAsyncEventArgs();

            args.UserToken = socket;
            args.RemoteEndPoint = endPoint;
            args.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);

            socket.ConnectAsync(args);
            autoEvent.WaitOne();

            if (args.SocketError != SocketError.Success)
                throw new SocketException((int)args.SocketError);
        }


        internal void Disconnect()
        {
            socket.Close();
        }


        #region Events

        private void OnConnect(object sender, SocketAsyncEventArgs e)
        {
            autoEvent.Set();
            isConnected = (e.SocketError == SocketError.Success);
        }


        private void OnReceive(object sender, SocketAsyncEventArgs e)
        {
            autoSendReceiveEvents[Send].Set();
        }


        private void OnSend(object sender, SocketAsyncEventArgs e)
        {
            autoSendReceiveEvents[Receive].Set();

            if (e.SocketError == SocketError.Success)
            {
                if (e.LastOperation == SocketAsyncOperation.Send)
                {
                    Socket handler = e.UserToken as Socket;

                    byte[] responce = new byte[255];
                    e.SetBuffer(responce, 0, responce.Length);
                    e.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceive);

                    handler.ReceiveAsync(e);
                }
            }
            else
                ProcessError(e);
        }

        #endregion

        private void ProcessError(SocketAsyncEventArgs e)
        {
            Socket handler = e.UserToken as Socket;

            if (handler.Connected)
            {
                try
                {
                    handler.Shutdown(SocketShutdown.Both);
                }
                catch (Exception)
                {
                }
                finally
                {
                    if (handler.Connected)
                        handler.Close();
                }
            }

            throw new SocketException((int)e.SocketError);
        }


        internal string SendReceive(string message)
        {
            if (isConnected)
            {
                byte[] bytes = Encoding.GetEncoding("cp1251").GetBytes(message);

                SocketAsyncEventArgs args = new SocketAsyncEventArgs();
                args.SetBuffer(bytes, 0, bytes.Length);
                args.UserToken = socket;
                args.RemoteEndPoint = endPoint;
                args.Completed += new EventHandler<SocketAsyncEventArgs>(OnSend);

                socket.SendAsync(args);
                AutoResetEvent.WaitAll(autoSendReceiveEvents);

                return Encoding.GetEncoding("cp1251").GetString(args.Buffer, args.Offset, args.BytesTransferred);
            }
            else
                throw new SocketException((int)SocketError.NotConnected);
        }


        public void Dispose()
        {
            autoEvent.Close();
            autoSendReceiveEvents[Send].Close();
            autoSendReceiveEvents[Receive].Close();

            if (socket.Connected)
                socket.Close();
        }

    }


 public partial class Page : UserControl
    {
        private SocketClient clntSocket; 

        public Page()
        {
            InitializeComponent();

            clntSocket = new SocketClient("127.0.0.1", 8008);
        }

        
        private void btnConnect_Click(object sender, RoutedEventArgs e)
        {
            clntSocket.Connect();
        }


        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            txtInfo.Text = clntSocket.SendReceive("Hello Server");
        }


        private void btnReceive_Click(object sender, RoutedEventArgs e)
        {
            
        }


        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            clntSocket.Disconnect();
        }

    }



--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Anyone
Дата 22.7.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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