Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/224: Рейтинг темы: голосов - 224, средняя оценка - 4.82
1 / 1 / 1
Регистрация: 27.11.2010
Сообщений: 8

Socket - реализация клиент-сервера

07.12.2010, 01:03. Показов 44843. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
если честно, никогда не задавался целью, как на .Net реализовать клиент-сервер, но вот приперло, а как сделать, не понимаю вообщем-то

вот суть проблемы


1. Разработать программное обеспечение, реализующее передачу данных между компьютерами на уровне стека протоколов TCP/IP.
2. Используя возможности стека протоколов TCP/IP организовать распределённую обработку информации не менее чем на 3 компьютерах для решения конкретной прикладной задачи (Табл. 7.1)
3. Сравнить время нахождения решения на нескольких компьютерах с временем решения задачи на одном компьютере
а условие
Используя разложение в ряд Маклорена (Тейлора) вычислить с заданной точностью значение функции f(x)=ln(1+x) - просто в голову пришло.....

помогите сделать, если честно, даже не понимаю, как реализовать сервер-клиент...а все остальное прикрутить к нему впринципе дело не хитрое
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2010, 01:03
Ответы с готовыми решениями:

Socket - реализация клиент-сервера: написать пример кода отправки класса в сжатом виде
Может кто-нибудь написать пример кода отправки класса в сжатом виде и его приема? Одна тема - один вопрос (Правила п.3.15)

Клиент/сервер не работает через Socket
Доброго дня форумчане. Прошу консультации - пишу для работы приложение для связи БД и мобильного приложения. Возникли проблемы при...

Socket: безпрерывный прием от сервера
Форумчане, такая проблема клиент получает от сервера ответ только после того как что то на него отсылает, а если например пишет другой...

19
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
07.12.2010, 03:14
Вот пример клиент-сервер.
Вложения
Тип файла: rar SocketClass.rar (21.3 Кб, 4355 просмотров)
4
1 / 1 / 1
Регистрация: 27.11.2010
Сообщений: 8
07.12.2010, 18:30  [ТС]
Огромное спасибо, буду пробовать реализовывать

Добавлено через 42 минуты
вот с толкнулся с проблемой - в данном примере подключается клиент к серверу и отправляет ему сообщения....более одного клиента сервер не видит....

видимо где-то здесь в коде это прописано или я что-то не догоняю

C#
1
2
3
4
5
6
7
8
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Создаем основной сокет
        IPAddress ipAddress = null; //IP-адресс
        IPEndPoint Addr = null; //конечная точка(IP и порт)
Addr = new IPEndPoint(IPAddress.Any, 5300); //"localhost" = 127.0.0.1
                s.Bind(Addr); //"Адресуем" сокет
                s.Listen(10); //Обозначаем количество ожидающих в очереди на подключение
                Console.WriteLine("Ждем коннекта...");
                Socket cl_s = s.Accept(); //Ожидаем подключения

по идее, он сначала слушает порт, а после производит подключение к доступным.
пробовал запускать 2 клиента и 1 сервер - все равно синхронизация идет на уровне 1 клиент - 1 сервер

может кто поможет решить проблему?
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
07.12.2010, 22:01
Могу решить проблему:
s.Listen(10); //Это и есть количество клиентов, которые одновременно могут быть подключены
Socket cl_s = s.Accept(); //Ожидает подключения нового клиента. При Каждом прохождении приложения по данной строке в Socket cl_s ложится сокет первого клиента в очереди. Так что можно положить строку в цикл принятые данные передавать в новый поток и таким образом каждый поток будет обрабатывать по одному клиенту.
0
2 / 2 / 2
Регистрация: 23.01.2011
Сообщений: 43
27.06.2011, 13:12
Здравствуйте. Подскажите пожалуйста, а как подключиться к серверу.
Запускаю программу жму 1 (или 2) и что делать дальше не пойму? Если можно при первом и втором случае, дальнейшие действия для отправки или приема какие должны быть?
Спасибо
0
2 / 2 / 0
Регистрация: 03.10.2010
Сообщений: 29
28.06.2011, 13:23
Прием пакетов:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void Start() 
{
    ListenSocket = new Socket(Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    ListenSocket.Bind(new IPEndPoint(Address, Port));
    ListenSocket.Listen(50);
    ListenSocket.BeginAccept(new AsyncCallback(this.OnAccept), ListenSocket);
}
public override void OnAccept(IAsyncResult ar)
{
    try
    {
        var newSocket = ListenSocket.EndAccept(ar);
        newSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceiveQuery), newSocket );
    }
    catch{}
    ListenSocket.BeginAccept(new AsyncCallback(OnAccept), ListenSocket);
}
В OnReceiveQuery не забудь сделать socket.EndReceive

Отправка пакета:
C#
1
2
3
var s = ConnectSocket("10.0.0.13", 1880);
var buffer = DoRequest(Encoding.ASCII.GetBytes(str), s);
var content = Encoding.ASCII.GetString(buffer.ToArray());
где:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private static byte[] DoRequest(byte[] request, Socket s)
{
    var bytesReceived = new Byte[40960];
    s.Send(request, request.Length, SocketFlags.None);
    var bytes = 0;
    var buffer = new List<Byte>();
    s.ReceiveTimeout = 5000;
 
    do
    {
        try
        {
            bytes = s.Receive(bytesReceived, 0, bytesReceived.Length, SocketFlags.None);
            buffer.AddRange(bytesReceived.Take(bytes));
        }
        catch (SocketException ex)
        {
            break;
        }
        catch (Exception ex)
        {
            break;
        }
    } while (bytes > 0);
    s.Shutdown(SocketShutdown.Both);
    return buffer.ToArray();
}
и:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static Socket ConnectSocket(string server, int port)
{
    Socket s = null;
    var hostEntry = Dns.GetHostEntry(server);
    foreach (var address in hostEntry.AddressList)
    {
        try
        {
            var ipe = new IPEndPoint(address, port);
            var tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            tempSocket.Connect(ipe);
            if (tempSocket.Connected)
            {
                s = tempSocket;
                break;
            }
        }
        catch (Exception) { }
    }
    return s;
}
Собственно всё.
2
2 / 2 / 2
Регистрация: 23.01.2011
Сообщений: 43
28.06.2011, 14:55
Цитата Сообщение от Elkenos Посмотреть сообщение
.................
Собственно всё.
ОГО!
Верхний по проще и с коментами. Все равно спасибо.

Еще один вопросик:
К примеру нужно отправить объект "Т"-класса, в котором имеется, например List<string>. как преобразовать его для отправки?
C#
1
2
3
4
5
6
7
8
9
10
public class T
    {
        public List <string> list;
        public T ()
        {
            list.Add("ABC");
            list.Add("CBA");
        }
 
    }
Может как нибудь через сериализацию?
Какие есть идеи?
Спасибо.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
28.06.2011, 15:36
Естественно, сериализировать его и отправлять...

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
 
namespace Serialization
{
    class Program
    {
        static void Main(string[] args)
        {
            string st = "";
            int a = 32000;
            MemoryStream ms1 = new MemoryStream();
            MemoryStream ms2 = new MemoryStream();
            Console.WriteLine("Введите строку:");
            st = Console.ReadLine();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms1, a);
            bf.Serialize(ms2, st);
            GZipStream zip = new GZipStream(ms2, CompressionMode.Compress);
            byte[] buffer = new byte[st.Length];
            zip.Write(buffer, 0, buffer.Length);
 
            Console.WriteLine("Результаты сериализации:");
            ms1.Position = 0;
            ms2.Position = 0;
            Console.WriteLine("{0}", (int)bf.Deserialize(ms1));
            Console.WriteLine("{0}", (string)bf.Deserialize(ms2));
            byte[] b = BitConverter.GetBytes(a);
            Console.ReadKey();
        }
    }
}
Вместо String'а можно использовать любой класс.
1
2 / 2 / 2
Регистрация: 23.01.2011
Сообщений: 43
28.06.2011, 18:52
Цитата Сообщение от body90 Посмотреть сообщение
C#
1
2
3
GZipStream zip = new GZipStream(ms2, CompressionMode.Compress); 
byte[] buffer = new byte[st.Length]; 
zip.Write(buffer, 0, buffer.Length);
А можно чуть подробней об этом. Как работает?

Добавлено через 1 час 36 минут
Что-то не так. Сервер конектиться но выдает пустоту.(((

Сервер-прием:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public class NetWorkServer
    {
        static void Main(string[] args)
        {
            BinaryFormatter Serial = new BinaryFormatter();
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
            IPEndPoint Addr = null;
            Addr = new IPEndPoint(IPAddress.Any, 53000); //"localhost" = 127.0.0.1
            s.Bind(Addr); //"Адресуем" сокет
            s.Listen(10); //Обозначаем количество ожидающих в очереди на подключение
            Socket cl_s = s.Accept(); //Ожидаем подключения
            while (!Console.KeyAvailable) //Пока не нажата клавиша
            {
                byte[] msg = new byte[cl_s.Available];
                cl_s.Receive(msg); //Принимаем МСГ
                Console.WriteLine(Encoding.UTF8.GetString(msg)); //Конвертируем и выводим
            }
            cl_s.Close(); //Закрываем сокет
        }
 
    }
Клиент-передача:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void Main(string[] args)
        {
           
            List<string> list = new List<string>();
            list.Add("asdw");
            
            MemoryStream ms =new MemoryStream();
            BinaryFormatter Serial = new BinaryFormatter();
            Serial.Serialize(ms,list);
            GZipStream zip = new GZipStream(ms, CompressionMode.Compress);
            byte[] buffer = new byte[list.Capacity];
            zip.Write(buffer, 0, buffer.Length);
            
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
            IPAddress ipAddress = null; //IP-адресс
            IPEndPoint Addr = null; //конечная точка(IP и порт)
            ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
            Addr = new IPEndPoint(ipAddress, 53000);
            s.Connect(Addr); //Коннектимся к срверу
 
            byte[] msg = buffer; //Конвертируем
            s.Send(msg); //Отправляем
            s.Close(); //Закрываем сокет
            Console.ReadKey();
        }
Подскажите, пожалуйста, что не так.
Спасибо
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.06.2011, 02:11
kapitaneo, это я кинул просто код, который когда-то писал для примера сериализации.

Цитата Сообщение от kapitaneo Посмотреть сообщение
C#
1
2
3
GZipStream zip = new GZipStream(ms2, CompressionMode.Compress); 
byte[] buffer = new byte[st.Length]; 
zip.Write(buffer, 0, buffer.Length);
Это сжатие данных с помощью алгоритма GZip. Если это делать - нужно на другой стороне сделать обратное.
0
2 / 2 / 2
Регистрация: 23.01.2011
Сообщений: 43
29.06.2011, 11:35
Понятно.
Так а как теперь вытянуть назад?
C#
1
2
 byte[] msg = new byte[cl_s.Available];
                cl_s.Receive(msg); //Принимаем МСГ
При приеме посылки??
Помогите разобраться.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
29.06.2011, 19:20
Просто не сжимайте данные.
Если в вашем приложении нужно их сжимать - то я чуть позже напишу код как получить обратное.
1
1 / 1 / 0
Регистрация: 15.06.2011
Сообщений: 21
09.12.2011, 11:13
Здравствуйте.
Цитата Сообщение от body90 Посмотреть сообщение
Socket cl_s = s.Accept(); //Ожидает подключения нового клиента. При Каждом прохождении приложения по данной строке в Socket cl_s ложится сокет первого клиента в очереди. Так что можно положить строку в цикл принятые данные передавать в новый поток и таким образом каждый поток будет обрабатывать по одному клиенту.
а можно по точнее? Я попробовал взять его в цикл, но ничего не происходило... Сервер бесконечно ждал подключения...

И ещё такой вопрос, как можно этот код
Цитата Сообщение от body90 Посмотреть сообщение
Вот пример клиент-сервер.
Вложения SocketClass.rar (21.
Адаптировать для работы по интернету?
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
09.12.2011, 13:56
Цитата Сообщение от Oldren Посмотреть сообщение
Сервер бесконечно ждал подключения...
А Вы клиентов подключали к нему?

Добавлено через 2 минуты
Цитата Сообщение от Oldren Посмотреть сообщение
Адаптировать для работы по интернету?
Этот код и работает в сетях. Везде, где IP есть. Естественное условие - наличие выделенного IP. Иначе клиенты просто не смогут Вас найти в сети.
0
1 / 1 / 0
Регистрация: 15.06.2011
Сообщений: 21
09.12.2011, 14:30
Цитата Сообщение от body90 Посмотреть сообщение
А Вы клиентов подключали к нему?
Да, подключал! В клиенты вводил текст, отправлял... у сервера ноль реакции...

Цитата Сообщение от body90 Посмотреть сообщение
Этот код и работает в сетях.
Хм...В коде клиента я указал:
C#
1
Addr = new IPEndPoint(IPAddress.Parse("78.29.77.191"), 5300);
"78.29.77.191"-мой ip на данный момент...
но при попытке подключения клиент выдаёт ошибку:
Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 78.29.77.191:5300
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
09.12.2011, 20:27
У вас выделенный IP?
0
1 / 1 / 0
Регистрация: 15.06.2011
Сообщений: 21
09.12.2011, 21:27
Цитата Сообщение от body90 Посмотреть сообщение
У вас выделенный IP?
нет...
Проблема ушла сама собой, когда я напрямую подключился к интернету... До этого подключался через роутер)
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
09.12.2011, 21:35
Я же о том и говорил. Вы были за шлюзом. Хотя, роутер настроить можно было как-то.
0
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699
09.12.2011, 22:20
Почитайте связку из Шилдта и братьев Албахари на эту тему.. Сам по ним разбирался. А ввообще для реализации сетивых проектов надо бы прочитать книгу - Эндрю Кровчик, Винод Кумар, Номан Лагари, Аджит Мунгале, Кристиан Нагел, Тим Паркер, Шриниваса Шивакумар - .Net. Сетевое программирование для профессионалов , но я никак не решусь..
p.s. извиняйте за флуд
0
09.12.2011, 23:06

Не по теме:

Последнюю хотел приобрести когда-то, но не нашел на нашем книжном рынке.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2011, 23:06
Помогаю со студенческими работами здесь

Реализация Tracert (Socket, ICMP)
Добрый день! Задача заключается в следующем: нужно сделать реализацию &quot;tracert&quot; не используя готовые классы. Нашел подходящий мне...

Бесперерывное получение ответа от сервера(Socket)
Собственно как настроить бесперерывное получение? на данный момент я получаю так: int bytesRec = sendr.Receive(receiveBytes);

Socket не могу понять в чем дело, не закрывается клиент или сервер
Где то в просторах инета (возможно даже на этом форуме) нашел пример по клиент серверу на цокетах, смастерил клиент и сервер, все хорошо...

Передача файлов через Socket. Клиент получает текст в неверной кодировке
Нужно передать файл от приложения-сервера к приложению-клиенту. На сервере используется код с MSDN:...

Как отправить byte[] с сервера клиенту через socket
Как отправить byte с сервера клиенту через socket? Я могу отправить с клиента на сервер вот так. Клиент: string ipadr =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru