Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2015, 18:54   #11
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Браузер работает с текстовым трансппортом - http, новые умеют еще вебсокеты, только это другие сокеты.

Цитата:
Передатчик у меня будет сервером, или клиентом?
что такое передатчик?
Серверы могу отвечать на запросы, а могут без запросов посылать данные, зависит от программиста, как ему надо так и будет, настройками и кодом регулируется.

Браузер это просто клиент, причем активный, т.е. он как правило посылает запросы и ждет ответов, что бы он что то дождался надо написать спец. программу-сервер который будет отвечать.

Последний раз редактировалось Stilet; 22.10.2015 в 10:00.
come-on вне форума Ответить с цитированием
Старый 22.10.2015, 09:23   #12
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Я запустил простой пример, сервер находится по адресу localhost:11000. Все шикарно, передал из клиента серверу сообщение.
Но совсем запутался, а вот как, все-таки, можно с помощью сокетов сделать так, чтобы я мог что-то прочитать по этому адресу в браузере? Либо объясните вообще, в на сокетах разве нельзя написать свой мини-денвер? В чем суть сокетов? Просто я не понимаю, если есть адрес localhost:11000, то почему по нему нельзя перейти? Как тогда можно ответы со стороны сервера написать? Мне просто интересно. Вот я сделаю сервер и клиент, вроде, не сложно. А дальше мне нужно, чтобы сервер получал данные с клиента, но при этом все рассказывал браузеру, получил ли он, что получил, планы на будущее...

И еще вопрос. Сокет -сервер работает по циклу while(1). У меня в программе работа не с While, а по таймеру, причем на один цикл тратится, например, 500 мс. Как сделать программу так, чтобы сокет работал в этом случае? Пока чисто теоретически.

Я почти уж было нашел ответ здесь http://www.cyberforum.ru/csharp-net/...ead113231.html, но смотрите:

Код у меня теперь такой, добавил в графический интерфейс label1, RichTextBox1, Button1 и Button2. Но при попытке запуска выдает эксепшн на строке socket.Close(); Почему? Зы клиент я не запускал при этом.

Код:
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;
using System.Net;
using System.Net.Sockets;

namespace SocketServer
{

    public partial class Form1 : Form
    {
        // делегат для ожидания соединения
        private delegate void Connect();
        // делегат для приема сообщений
        private delegate void Send();

        Socket socket;
        Socket client;
        EndPoint end;
        byte[] buffer;

        public Form1()
        {
            InitializeComponent();
            // чтобы не ругалось на то, что компоненты формы
            // используются в другом потоке
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // инициализация сокета
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // говорим, чтобы сервер использовал любой ip
            IPAddress ip = IPAddress.Any;
            // созаем параметр для привязки сокета к адресу
            IPEndPoint ipe = new IPEndPoint(ip, 11000);
            end = (EndPoint)ipe;
            // привязка сокета к адресу
            socket.Bind(ipe);
            // указываем количество запросов на соединение в очереди
            socket.Listen(1);
            label1.Text = "Порт в режиме ожидания соединения";
            // выполняется асинхронно в потоке, тем самым программа не зависает
            new Connect(delegate() { Conect(); }).BeginInvoke(null, null);
        }
        // подключение клиента к серверу
        private void Conect()
        {
            client = socket.Accept();
            label1.Text = "Соединение установлено";
        }
        // метод для получения сообщений и отправки ответа
        private void SendMessage()
        {
            try
            {
                // получение сообщения
                buffer = new byte[256];
                client.ReceiveFrom(buffer, ref end);
                Mess(buffer);
                // отправка ответа
                string str = "Сообщение получено";
                byte[] service = Encoding.Default.GetBytes(str);
                client.Send(service, service.Length, 0);
            }
            catch // если соединение разовано, то завешение приложения
            {
                Quit();
            }
        }
        // кнопка выхода
        private void button1_Click(object sender, EventArgs e)
        {
            Quit();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // ожидание сообщения не вызывает зависание программы
            new Send(delegate() { Connected(); }).BeginInvoke(null, null);
        }
        // метод для запуска автоматического приема сообщений
        private void Connected()
        {
            while (true)
            {
                SendMessage();
            }
        }
        // обновление информации в текстовом окне
        private void Mess(byte[] buf)
        {
            richTextBox1.Text += Encoding.Default.GetString(buf);
        }
        // метод для завершения приложения
        private void Quit()
        {
            socket.Close();
            Application.Exit();
        }

       
        
    }
}

Последний раз редактировалось Stilet; 22.10.2015 в 10:00.
Krasi вне форума Ответить с цитированием
Старый 22.10.2015, 10:08   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
можно с помощью сокетов сделать так, чтобы я мог что-то прочитать по этому адресу в браузере?
С помошью сокетов ты можешь запросить данные с некоего сервера. и считать. И все.
Т.е. ответ на такую постановку вопроса - "да".

Цитата:
в на сокетах разве нельзя написать свой мини-денвер?
Конечно можно, но не так просто для новичка.
Цитата:
В чем суть сокетов?
в управлении передачей данных с помошью сетевых устройств посредством операционной системы. В сокетах нет понятия "запроса", есть просто - послать массив байт в сеть и считать массив байт из сети. И все.
Цитата:
И еще вопрос. Сокет -сервер работает по циклу while(1). У меня в программе работа не с While, а по таймеру, причем на один цикл тратится, например, 500 мс. Как сделать программу так, чтобы сокет работал в этом случае?
Ну есть функции прослушки сокета. Они, скажем так, притормаживают ПО до прихода на сетевую карточку данных. выглядит в псевдокоде эт так:
Код:
while(true){
 Accept(сокет);
 recv(сокет, масисв байт);
}
Accept замораживает поток пока данные на сетевушке не появятся. Поэтому такие циклы либо прописывают в доппотоках, либо использую неблокирующие сокеты.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.10.2015, 10:18   #14
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

А почему у меня может в клиенте возникать ошибка
Цитата:
Error 1 'SocketServer.Form1' does not contain a constructor that takes 0 arguments C:\Users\engineer\Documents\Visual Studio 2013\Projects\SocketClient\SocketSe rver\Program.cs 19 29 SocketServer
Вот код
Код:
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;
using System.Net;
using System.Net.Sockets;

namespace SocketServer
{

    public partial class Form1 : Form
    {
        // делегат для получения ответа
        private delegate void Answer();

        string IP;
        string Port;
        Socket socket;
        EndPoint end;

        public Form1(string ip, string port)
        {
            InitializeComponent();
            this.IP = ip;
            this.Port = port;
            // чтобы не ругалось на то, что компоненты формы
            // используются в другом потоке
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        // кнопка закрытия формы
        private void button1_Click(object sender, EventArgs e)
        {
            socket.Close();
            Application.Exit();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // инициализация сокета
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // создание параметра для подключения к серверу
            IPAddress ip = IPAddress.Parse(IP);
            IPEndPoint ipe = new IPEndPoint(ip, int.Parse(Port));
            end = (EndPoint)ipe;
            try
            {
                socket.Connect(ipe);
                this.Text += " - Соединение установлено";
            }
            catch // на случай каких-либо проблем
            {
                MessageBox.Show("Проблемы с установкой соединения.\nПриложение будет закрыто.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }
        // отправка сообщения
        private void button2_Click(object sender, EventArgs e)
        {
            string str = richTextBox1.Text;
            byte[] buffer = Encoding.Default.GetBytes(str);
            socket.Send(buffer, buffer.Length, 0);
            // ожидание ответа от сервера
            new Answer(delegate() { Answ(); }).BeginInvoke(null, null);
        }
        // метод для получения ответа
        private void Answ()
        {
            byte[] answer = new byte[64];
            socket.ReceiveFrom(answer, 0, ref end);
            textBox1.Text = Encoding.Default.GetString(answer);
        }
        // очистка окна сообщений от сервера
        private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
        {
            textBox1.Text = "";
        }    
    }
}
Оригинал брал здесь http://www.cyberforum.ru/csharp-net/...ead113231.html
Krasi вне форума Ответить с цитированием
Старый 22.10.2015, 11:04   #15
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Хотя... Я нашел пример попроще. Помогите вот с этим разобраться.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace SocketServer3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ServerClass sc = new ServerClass();
            sc.startServer(textBox1, richTextBox1);
        }
    }


    public class ServerClass
    {
        public void startServer(TextBox tb, RichTextBox rb)
        {

            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9939);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Bind(ip);
            socket.Listen(20);
            rb.Text = rb.Text + "Waiting for client...";
            Socket client = socket.Accept();
            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

            rb.Text = rb.Text + "Connected with " + clientep.Address + " at port " + clientep.Port;

            string welcome = tb.Text;
            byte[] data = new byte[1024];
            data = Encoding.ASCII.GetBytes(welcome);
            client.Send(data, data.Length, SocketFlags.None);

            rb.Text = rb.Text + "Disconnected from" + clientep.Address;
            client.Close();
            socket.Close();
        }
    }
}
Это хоть запускается, но жму на кнопку, и ничего просто не происходит.
Krasi вне форума Ответить с цитированием
Старый 22.10.2015, 11:05   #16
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
Но совсем запутался, а вот как, все-таки, можно с помощью сокетов сделать так, чтобы я мог что-то прочитать по этому адресу в браузере?
Я вам уже писал почему.
Цитата:
Просто я не понимаю, если есть адрес localhost:11000, то почему по нему нельзя перейти?
Перейти это просто сленг, когда разговор идет про сайты и браузеры, на самом деле никто никуда ни ходит ни переходит.
Цитата:
Сокет -сервер работает по циклу while(1).
как напишет программист так и будет.
come-on вне форума Ответить с цитированием
Старый 22.10.2015, 11:07   #17
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
Это хоть запускается, но жму на кнопку, и ничего просто не происходит.
а что должно происходить?
come-on вне форума Ответить с цитированием
Старый 22.10.2015, 11:09   #18
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Сервер должен запуститься и ответить "Waiting for client...".
Krasi вне форума Ответить с цитированием
Старый 22.10.2015, 11:21   #19
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Кому ответить? где клиент, он к серверу подписался?
Вы начните не с непонятных примеров, а с того чтобы понять принципы работы. Иначе так и будете дальше тыкаться в ошибки.
come-on вне форума Ответить с цитированием
Старый 22.10.2015, 12:57   #20
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

так я говорю, запустил консольный вариант по самой первой выложенной мною ссылке на решение, разобрался, что если запустить сервер, то клиенту будет, к чему подключиться и куда отправить данные. Теперь надо как-то сделать это в Windows Forms. Клиент консольный у меня, я порт и localhost подправил, и рассчитывал на него, а он не подключался.
Сервер же должен ответить мне "Waiting...", даже если клиент к нему не подключается, не так ли? Так почему он вообще ни в какую не пишет эту строчку, почему так может быть?
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать данные в поток.. login10 C# (си шарп) 9 01.11.2014 15:08
Как передать данные из WebBrowser'a ? Santa86 C# (си шарп) 0 15.10.2014 17:42
как передать на сервер табличные данные Arassir PHP 3 02.10.2011 23:07
Как передать данные из БД в ComBox uni Microsoft Office Excel 8 22.07.2011 08:20
Как передать данные уже в запущеную программу dr.Chas Общие вопросы Delphi 15 18.06.2008 22:16