Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/184: Рейтинг темы: голосов - 184, средняя оценка - 4.95
 Аватар для KingManiya
203 / 203 / 13
Регистрация: 14.10.2011
Сообщений: 227
.NET 4.x

Технология клиент-сервер. Классы клиента и сервера. Обсуждение

16.10.2011, 16:02. Показов 37672. Ответов 107
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В данном теме выкладываю свои классы клиента и сервера, а так же простеньких примеров реализованных на этих классах. Жду конструктивной критики, идей, предложений по улучшению, оптимизации и прочего.
Так же прошу поправлять меня, если комментарии в коде не соответствуют реальной действительности. Комментировал то как я это понимаю.
P.S. с орфографией тоже туговато, так что исправляем


Класс СЕРВЕРА.
VB.NET
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
Imports System.Net.Sockets
 
Public Class Class_Server
    Public Delegate Sub StatusInvoker(ByVal t As String) ' делегат для синхронизации при выводе сообщений
 
 
    Private port As Integer = 13000 ' порт сервера на котором он работает
    Private server_name As String ' название сервера. Например: Game, Authorization server . Просто для удобства
    Private flag As Byte ' в текущий версии не используется. В будущем планируется клиентов с другим флагом сразу отключать, что бы только "правильные" клиенты могли подключаться к серверу.
 
    Private server_Listener As TcpListener ' Сам TcpListener который и прослушивает нужный порт
    Private clientsList As New Hashtable ' Список клиентов. (Уникальный индификатор ID,сам класс клиента)
 
    Public Event OnRead(ByVal _client As handleClinet, ByVal _data As String) ' Событие вызываемое при получении данных от клиентов
    Public Event Connect(ByVal _client As handleClinet) ' Событие вызываемое при подключении клиента
    Public Event Disconnect(ByVal _client As handleClinet, ByVal _reson As String) ' Событие вызываемое при отключении клиента
    Public Event messege(ByVal text As String) ' событие вызываемое, когда нужно передать информацию из класса
 
    Public Sub New(ByVal _Port As Integer, ByVal _Name As String, ByVal _Flag As Byte) ' инициализация класса. Порт, название, флаг
        port = _Port
        server_name = _Name
        flag = _Flag
    End Sub
 
    Public Sub start() ' Запуск сервера.
        Dim server_Thread As Threading.Thread = New Threading.Thread(AddressOf startServ)
        server_Thread.Start() ' Запуск отдельного потока на прослушивание порта и подключений к серверу
    End Sub
 
    Public Sub stop_server() ' Процедура для закрытия сервера. 
        Dim Item As DictionaryEntry
        Dim list As Hashtable = clientsList
        For Each Item In list ' Перебор всех клиентов в списке
            CType(Item.Value, handleClinet).closeClient() ' Закрываем каждого клиента, что бы поток клиента завершился.
        Next
 
        server_Listener.Stop() ' Остановка прослушивания порта
    End Sub
 
    Public ReadOnly Property User_List() As Hashtable ' Возращаем список клиентов в виде хэш таблицы.
        Get
            Return clientsList
        End Get
    End Property
 
    Private Sub Client_OnRead(ByVal client As handleClinet, ByVal data As String) ' Процедура, вызываемая при получении сервером данных от клиента
        RaiseEvent OnRead(client, data) ' вызываем событие сервера, что клиент прислал данные
    End Sub
    Private Sub Client_Disconnect(ByVal client As handleClinet, ByVal reson As String) ' Процедура, вызываемая при отключении клиента
        clientsList.Remove(client.ID) ' удаляем клиента из списка клиентов
        RaiseEvent Disconnect(client, reson) ' вызываем событие сервера, что отключился клиент
    End Sub
 
    Public Sub Send_user(ByVal client As handleClinet, ByVal data As String) ' Процедура отправки данных нужному клиенту
        Dim tcp As TcpClient = client.TCP() ' получаем TcpClient нужный для получения потока записи
        Dim stream As NetworkStream = tcp.GetStream ' получение потока записи
 
        Dim mess() As Byte = System.Text.Encoding.UTF8.GetBytes(data) ' преобразование сообщения в байты для потока
 
        stream.Write(mess, 0, mess.Length) ' отсылка данных в виде байт
        stream.Flush() ' честно не знаю, что это делает. Работает и с этим и без, но в большинстве примеров есть, поэтому оставил.
    End Sub
    Public Sub Send_all(ByVal data As String) ' Процедура посылки сообщения всем клиентам
        Dim Item As DictionaryEntry
        Dim list As Hashtable = clientsList
 
        For Each Item In list ' Перебор всех клиентов и рассылка через Send_user
            Send_user(CType(Item.Value, handleClinet), data)
        Next
    End Sub
 
 
    Private Sub startServ() ' процедура служащая для прослушивания порта и подключении клиентов
        Dim client As TcpClient
        Dim count As Integer ' Кол-во подключений
 
        Try
            server_Listener = New TcpListener(port)
            server_Listener.Start() ' Начинаем прослушивать порт
            msg("=========Сервер " & Me.server_name & " запущен...=========")
 
 
            While True ' Бесконечный цикл, что бы клиенты могли подключаться всегда
                count += 1 ' Новое подключение, значит счетчик +1
 
                client = server_Listener.AcceptTcpClient() ' Ждем подключения. Когда клиент подключается, запоминаем его в client
 
                Dim temp_client As New handleClinet(client, count) ' Создаем новый класс клиента и передаем ему подключившегося клиента и его номер подключения
                temp_client.startClient(Me) ' Запускаем клиента и прослушивание входящих сообщений. Ссылку на класс сервера передаем, что бы клиент мог добавить своё событие на Client_OnRead
                clientsList.Add(temp_client.ID, temp_client) ' Добавляем клиента в список клиентов
 
                RaiseEvent Connect(temp_client) ' Вызываем событие, что клиент подключился
            End While
        Catch ex As Exception
            msg("=========Ошибка сервера " & Me.server_name & ". Причина: " & ex.Message) ' Сообщаем об ошибке
        End Try
 
        ' Так как сюда попасть можно, только после ошибки, значит сервер остановлен. Сообщаем об этом.
        msg("=========Сервер " & Me.server_name & " остановлен!=========")
 
    End Sub
 
    Public Sub msg(ByVal t As String) ' Процедура отправки сообщения
        Try
            RaiseEvent messege(t) ' Вызываем событие о новом сообщении
        Catch ex As Exception
            MsgBox(ex.Message, , "Msg Сервера")
        End Try
    End Sub
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    Public Class handleClinet ' Класс клиента в сервере. Нужен для индификации и базовых дейсвий с клиентом 
        Public Event OnRead(ByVal _client As handleClinet, ByVal _data As String) ' Событие, что текущий клиент получил данные
        Public Event Disconnect(ByVal _client As handleClinet, ByVal _reson As String) ' Событие при отключении текущего клиента
 
        Private mgID As Guid = Guid.NewGuid ' Получаем уникальный индификатор клиента для хэш таблицы списка клиентов
        Private clientSocket As TcpClient ' Сокет клиента
        Private stream As NetworkStream ' Поток данных клиента
        Private clNo As String ' Номер клиента
        ' Private serv As Class_Server
        Private myIP As String ' Храним тут ип этого клиента
 
        Public Sub New(ByVal inClientSocket As TcpClient, ByVal count As Integer) ' Инициализация клиента
            Me.clientSocket = inClientSocket
            Me.stream = clientSocket.GetStream()
            Me.clNo = count
        End Sub
 
        Public ReadOnly Property IP() As String ' Получение IP
            Get
                If myIP = "" Then myIP = clientSocket.Client.RemoteEndPoint.ToString
                Return myIP
            End Get
        End Property
 
        Public ReadOnly Property ID() As String ' Получение ID
            Get
                Return mgID.ToString
            End Get
        End Property
        Public ReadOnly Property Number() As String ' Получение номера клиента 
            Get
                Return clNo.ToString
            End Get
        End Property
        Public ReadOnly Property TCP() As TcpClient ' Получение TcpClient клиента 
            Get
                Return clientSocket
            End Get
        End Property
        Public Sub closeClient() ' Процедура принудительного закрытия подключения клиента
            stream.Close()
            clientSocket.Close()
        End Sub
 
        Public Sub startClient(ByVal _serv As Class_Server) ' Процедура запуска клиента
            Dim client_Thread As Threading.Thread = New Threading.Thread(AddressOf doListen)
            client_Thread.Start() ' Запуск прослушивания новых данных текущим клиентом в отедьном потоке
 
            AddHandler Me.OnRead, AddressOf _serv.Client_OnRead ' При срабатывании события OnRead в клиенте, вызываем процедуру Client_OnRead на самом сервере
            AddHandler Me.Disconnect, AddressOf _serv.Client_Disconnect ' При срабатывании события Disconnect в клиенте, вызываем процедуру Client_Disconnect на самом сервере
        End Sub
        Private Sub doListen()
            Dim bytes(1048576) As Byte ' 1мб буфер, что бы данные не дробились.
            Dim data As String
            Dim i As Int32
 
            Try
                i = stream.Read(bytes, 0, bytes.Length) ' Ждем новых данных от клиентского приложения. При получении заносим данные в буфер bytes и длину данных в i
                While (i <> 0) ' Цикл бесконечный, пока длина считанных данных не окажется=0, что ознает, что клиент оключился.
                    data = System.Text.Encoding.UTF8.GetString(bytes, 0, i) ' Переводим байты в текст
                    RaiseEvent OnRead(Me, data) ' Вызываем событие о получении новых данных
 
                    i = stream.Read(bytes, 0, bytes.Length) ' Ждем новых данных от клиентского приложения. При получении заносим данные в буфер bytes и длину данных в i
                End While
                closeClient() ' Так как вышли из цикла, то клиентское приложение закрыло соединение. Следовательно закрываем и мы.
                RaiseEvent Disconnect(Me, "Клиент решил отключиться от сервера.") ' Вызываем событие, что клиент отключился и передаем причину.
 
            Catch ex As Exception
                closeClient() ' Ошибка, значит отключаем клиента.
                RaiseEvent Disconnect(Me, "Проблема соединения: " & ex.Message) ' Вызываем событие, что клиент отключился и передаем причину.
 
            End Try
 
        End Sub
    End Class
End Class



Класс КЛИЕНТА
VB.NET
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
Imports System.Net.Sockets
 
Public Class Class_client
    Public Delegate Sub StatusInvoker(ByVal t As String) ' делегат для синхронизации при выводе сообщений
 
    Dim client As TcpClient ' Текущий TcpClient связывающий клиента и сервер
    Dim stream As NetworkStream ' Поток данных связывающий клиента и сервер
    Dim flag As Byte ' Пока не используется. Нужен для индификации сервером "правильного" клиента
 
    Dim connection As Boolean = False ' Состояние подключения
 
 
    Public Event OnRead(ByVal _data As String) ' Событие, при получении данных от сервера
    Public Event Disconnected(ByVal _reson As String)  ' Событие, при отключении от сервера
    Public Event messege(ByVal text As String)  ' Событие, при необходимости передать сообщение из класса
    Dim s As Object
 
    Public Function Connect(ByVal server As String, ByVal port As Integer, ByVal _Flag As Byte) As Boolean ' Функция подключения клиента к серверу. Вернет True в случае удачи и False при ошибке.
        If connection = False Then ' Проверка не подключены ли мы уже?
            Try
                Me.client = New TcpClient(server, port)
                Me.stream = client.GetStream()
                Me.flag = _Flag
                Dim client_Thread As Threading.Thread = New Threading.Thread(AddressOf Me.doListen)
                client_Thread.Start() ' Запуск отдельного потока на прослушивание данных с сервера.
                connection = True ' Состояние=Подключен
                Return True
            Catch ex As Exception
                msg(ex.Message) ' Сообщаем об ошибке
                Return False
            End Try
        Else
            Return False ' Если уже подключены, тогда новое подключение не удалось
        End If
    End Function
 
    Public Sub Disconnect(Optional ByVal s As String = "") ' Процедура отключения от сервера. Возможно указать коментарий.
        If connection Then
            connection = False ' Состояние=Отключен
            stream.Close()
            client.Close()
            If s = "" Then
                RaiseEvent Disconnected("Отключен") ' Вызываем событие отключения с коментарием "по умолчанию"
            Else
                RaiseEvent Disconnected(s) ' Вызываем событие отключения с коментарием указанным при вызове текущей процедуры
            End If
 
        End If
    End Sub
 
    Public Function Send(ByVal data As String) As Boolean ' Функция отправки сообщения серверу. Вернет True, если посылка удалась или False в обратном случаее
        If connection Then
            Try
                Dim databyte() As Byte = System.Text.Encoding.UTF8.GetBytes(data) ' Создаем массив байтов для отправки из Data
                stream.Write(databyte, 0, databyte.Length) ' Отправляем наш массив байт.
                stream.Flush() ' честно не знаю, что это делает. Работает и с этим и без, но в большинстве примеров есть, поэтому оставил.
                Return True ' Говорим, что посылка удалась
            Catch ex As Exception
                msg(ex.Message) ' Сообщаем об ошибке
                Disconnect("Проблема при отправке.") ' Отключаемся
                Return False
            End Try
        Else
            Return False ' Если не подключены, то отправка не удалась.
        End If
    End Function
 
 
    Private Sub doListen() ' Процедура прослушки сообщений от сервера
 
 
        Dim bytes(1048576) As Byte ' 1мб буфер, чтобы данные не дробились.
        Dim data As String
        Dim i As Int32
 
        Try
            i = stream.Read(bytes, 0, bytes.Length) ' Ждем новых данных от сервера. При получении заносим данные в буфер bytes и длину данных в i
            While (i <> 0) ' Цикл бесконечный, пока длина считанных данных не окажется=0, что ознает, что соединение с сервером прекращенно.
                data = System.Text.Encoding.UTF8.GetString(bytes, 0, i) ' Переводим байты в текст
                RaiseEvent OnRead(data) ' Вызываем событие о получении новых данных
 
                i = stream.Read(bytes, 0, bytes.Length) ' Ждем новых данных от сервера. При получении заносим данные в буфер bytes и длину данных в i
            End While
            Disconnect() ' Так как вышли из цикла, то сервер закрыло соединение. Следовательно отключаемся.
        Catch ex As Exception
            Disconnect(ex.Message) ' Ошибка, значит отключаемся, указав причину.
        End Try
 
    End Sub
 
 
 
    Public Sub msg(ByVal t As String) ' Процедура отправки сообщения
        Try
            RaiseEvent messege(t)  ' Вызываем событие о новом сообщении
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class


Сообщение в разработке. Примеры будут чуть позже.
35
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.10.2011, 16:02
Ответы с готовыми решениями:

Как вызвать Disconnect клиента (Технология Клиент-Сервер)
Как на сервере вызвать дисконнект клиента на пример когда произойдет тик таймера, пробовал многими способами писало что не доступно...

Чат "Сервер-клиент". На сервер не могу отправить сообщение с клиента
Не могу понять как сделать, чтоб сервер ещё прослушивал и сообщения... Нет ли входящих данных. Один раз пройдёт, напишет ник и опять в...

Http сервер и клиент. При попытке получить ответ клиента от сервера ошибка: Поток был недоступен для чтения
Здравствуйте, пытаюсь разобраться с написанием клиент-серверного приложения используя сокеты. Написал в одном консольном проекте сервер: ...

107
7 / 7 / 0
Регистрация: 13.09.2012
Сообщений: 94
25.07.2013, 07:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nikita_Nikita Посмотреть сообщение
NIPR,
На виртуалке антивируса нет, на основном аваст 2009г. При запуске программы спрашивает разрешение кажется на передачу тех самых пакетов. Компьютер подключен через кабель напрямую, не через роутер. То есть как я понял, можно запустить у себя на компьютере сервер, и например из другой квартире можно запустить клиент и вести сетевой IP, причем эти компьютеры не должны быть соединены общей локальной сетью? Где тогда можно узнать свой сетевой IP?
Vic45rus,
То есть, если я все то же самое проделаю с компьютером в другой комнате, квартире, городе и т. д., то у меня будет все работать? Не обязательно что бы была локальна сеть?
Если хочешь без локалки, то тебе нужны:
1.Выделенный IP
2.Открытые порты(как правило открываются в настройках модема) - у меня покрайней мере нужно добавить порты в "триггер портов", а так же в "виртуальные серверы"
Я сам в игрушки на своих серверах так с друзьями играю

Как узнать сетевой ip:
1.Нажимаешь сочетание клавиш WIN + R
2.Вводишь в полученном окне CMD
3.Вводишь в черном окошке ipconfig
4.Там должен быть написан IPv4 он то и есть сетевой
1
70 / 71 / 19
Регистрация: 01.05.2013
Сообщений: 279
25.07.2013, 10:36
Мда... Спасибо. Купить выделенный IP проблем нет, но покупать TMeter за 3.000 как то желания нет =( Придется как то локалку делать) Спасибо всем, кто ответил)

P.S. Интересно, а где настраивать порты, если у меня интернет через кабель идет...
0
1 / 1 / 0
Регистрация: 31.07.2013
Сообщений: 32
03.08.2013, 16:07
извините за нубо вопрос, но как сделать так что бы при выводе сообщения с одного textbox`a в другое, был переход на другую строку, а то у меня постоянно текст не переходит, а заменяется
я пробовал ExviromentNewLine, vbCrLf, WriteLine
0
11 / 11 / 5
Регистрация: 22.08.2013
Сообщений: 77
22.08.2013, 05:16
Я создал похожий клиент и сервер (не на tcpclient и tcplistener, а на socket) и у меня такая же проблема, как и у Nikita_Nikita, у меня закрыты все порты, как показывает практика открывать на мтс бесполезно, так вот у меня идея, мы с друзьями создавали как-то сервер майнкрафт через хамачи, может здесь тоже самое использовать? (Чисто для себя, проверять на работоспособность)

И вопрос: а возможно с закрытыми портами без хамачи и подобных создавать сервер? Возможно не так как тут, а по другому протоколу связи.
Мне покоя не даёт вот эта строка (у меня программе), я понимаю, что здесь что,
VB.NET
1
Dim c As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
но может как-то по другому связываться с сервером(НЕ с помощью ip и порта) к примеру AddressFamily.Firefox, или это не то? (понятно, что тогда не stream использовать)

Хотя мне противоречат строки:
VB.NET
1
s.Connect("ip", 13000)
VB.NET
1
2
addr = New IPEndPoint(IPAddress.Any, 13000)
c.Bind(addr)
P.S. Сам понимаю, что возможно несу полный бред...

Добавлено через 4 минуты
InSiDeX, может
VB.NET
1
TextBox2.Text &= vbCrLf & TextBox1.Text
тоже самое
VB.NET
1
 TextBox2.Text = TextBox2.Text & vbCrLf & TextBox1.Text
0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 10
27.12.2013, 16:44
Господа, подскажите такой момент, если клиенты за NAT'ом, а сервак с чистым(белым) IP, прием сообщений от клиентов будет?
Заранее спасибо за понимание и поддержку!
0
10 / 10 / 0
Регистрация: 16.03.2012
Сообщений: 58
28.12.2013, 06:25
Находясь за NAT'ом можно вызвать подключение, но не принять.
Если соединение установлено сообщения будут идти в обе стороны, и не важно кто за чем стоит.
Советую почитать теорию по TCP и UDP
1
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 5
10.09.2015, 10:39
Добрый день!
Хоть тема и "заглохла", но всё-таки спрошу именно здесь:
Кто-нибудь пробовал передавать не текст, а объект? Пересмотрел кучу форумов и MSDN, везде передаётся только текст (для общения, передача простых команд и т.д.), но нигде не встречал передачу информации в другом виде (кроме как передача файлов, но это не подходит).
Интересует метод передачи некоего объекта (object) от сервера клиенту. Клиент знает,что принимаемый объект имеет определенную структуру и разбирает его на составные части.
Например, сервер обрабатывает какую-либо информацию и формирует список list (of object), в который входят различные типы данных (строковые, собственные классы, типизированные наборы) и передает этот список клиенту. Клиент принимает список и посредством обычного перебора элементов определяет тип каждого элемента списка и выполняет определенные действия в зависимости от типа элемента (например, строка - команда для выполнения клиентом определенных действий, а типизированный набор - это данные для вывода в таблицу и т.д.).
Пробовал ли кто-нибудь сделать нечто подобное?
Уже замучился искать каким образом можно передать объект...
0
 Аватар для XIST
1974 / 1082 / 150
Регистрация: 01.10.2009
Сообщений: 3,659
Записей в блоге: 1
10.09.2015, 12:23
Что значит передается везде в клиент-сервере текст?
Передаются байты
VB.NET
1
Dim bytes As Byte() = New Byte(1023) {}
что хотите то и передавайте
0
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 5
10.09.2015, 12:31
Это-то понятно, что байты передаются, я имел в виду, что в основном встречаются примеры, где передается текст, используя System.Text.Encoding.UTF8.GetBytes(data)
А вот как перевести в байты объект, я нигде не встречал...
Ведь при передачи оформляется одномерный массив byte, строку перегнать в массив не составляет труда, а вот как быть если передать надо не строку? Каким образом перевести в одномерный массив объект, который содержит в себе кучу информации? Ведь еще нужно как-то определять размер массива в зависимости от того сколько "весит" объект... Как вот это сделать?...
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
10.09.2015, 12:39
Цитата Сообщение от okinawa Посмотреть сообщение
А вот как перевести в байты объект, я нигде не встречал...
Путём сериализации. На ваш выбор бинарная, XML, SOAP...
0
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 5
10.09.2015, 13:02
Про сериализацию я нашёл кое-что (https://www.universalthread.co... spx?ID=549), но там для записи в файл, буду дальше искать...
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,665
Записей в блоге: 14
10.09.2015, 13:18
okinawa, обратите внимание на этот участок
VB.NET
1
2
3
4
5
6
7
8
9
Private Sub btnBinarySave_Click(ByVal sender As System.Object, _
                                ByVal e As System.EventArgs) _
                               Handles btnBinarySave.Click
   Dim fs As Stream = New FileStream( "c:\temp\BinarySerialization.dat", FileMode.Create )
   Dim bf As BinaryFormatter = New BinaryFormatter()
 
   bf.Serialize(fs, mobjEmployee1)
   fs.Close()
End Sub
BinaryFormatter.Serialize принимает первым аргументом экземпляр класса Stream - а значит можно подставить другие потоки, не только файловый (FileStream), но и MemoryStream (для записи в участок памяти, как в примере дальше), в строку и т.д.

Добавлено через 1 минуту
Список наследников класса Stream
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
      Microsoft.JScript.COMCharStream
      System.Data.OracleClient.OracleBFile
      System.Data.OracleClient.OracleLob
      System.Data.SqlTypes.SqlFileStream
      System.IO.BufferedStream
      System.IO.Compression.DeflateStream
      System.IO.Compression.GZipStream
      System.IO.FileStream
      System.IO.MemoryStream
      System.IO.Pipes.PipeStream
      System.IO.UnmanagedMemoryStream
      System.Net.Security.AuthenticatedStream
      System.Net.Security.SslStream
      System.Net.Sockets.NetworkStream
      System.Printing.PrintQueueStream
      System.Security.Cryptography.CryptoStream
Можете писать в любой.
Stream - класс
0
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 5
10.09.2015, 14:35
Хм...вот и пытаюсь понять, на примере клиент-сервера данной темы.
В общем пытаюсь модернизировать код отправки клиенту.
Заранее создал класс:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<Serializable()> _
Public Class DataClass
    Private _Commands As String
    Private _Data As List(Of String)
 
    Public Property Commands As String
        Get
            Return _Commands
        End Get
        Set(value As String)
            _Commands = value
        End Set
    End Property
 
    Public Property Data As List(Of String)
        Get
            Return _Data
        End Get
        Set(value As List(Of String))
            _Data = value
        End Set
    End Property
End Class
При нажатии кнопки отправки сообщения клиентам заполняю класс данными:
VB.NET
1
2
3
4
5
6
7
8
9
 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        SendData = New DataClass
        SendData.Commands = "Тестовая команда"
        Dim DataList As New List(Of String)
        DataList.Add("Данные 1 строка")
        DataList.Add("Данные 2 строка")
 
        SERVER.Send_all(SendData) '(TextBox2.Text & ";") ' Отправка сообщения из TextBox2 всем клиентам.
    End Sub
Далее модернизирую процедуру отправки:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Public Sub Send_user(ByVal client As handleClinet, ByVal data As DataClass) ' Процедура отправки данных нужному клиенту
        Dim tcp As TcpClient = client.TCP() ' получаем TcpClient нужный для получения потока записи
        Dim stream As NetworkStream = tcp.GetStream ' получение потока записи
 
        'Dim mess() As Byte = System.Text.Encoding.UTF8.GetBytes(data) ' преобразование сообщения в байты для потока
        Dim bf As BinaryFormatter = New BinaryFormatter()
        bf.Serialize(stream, data)
 
        stream.Flush()
        stream.Write(bf, 0, data) ' отсылка данных в виде байт
    End Sub
Вот здесь возникает проблема: что писать в параметрах stream.Write()? Здесь должна передаваться последовательность байтов, начиная с нуля и указанной длинны.
или эту команду можно убрать, а передача осуществляется как раз в момент сериализации bf.Serialize(stream, data)? Тогда Flush надо ставить перед bf.Serialize.

Добавлено через 1 час 7 минут
Вот наткнулся на статью: http://www.osix.net/modules/article/?id=692, изучаю, может кому тоже пригодится...
0
0 / 0 / 0
Регистрация: 10.09.2015
Сообщений: 5
11.09.2015, 16:26
Коллеги!
Нашёл решение проблемы: Первоначально научился сериализовывать данные и передавать в виде последовательности от клиента-серверу, но при попытке десериализации принятой последовательности на сервере возникала ошибка - сервер пытался найти сборку (приложение) в которой был сериализован объект.
Нашёл статью, в которой описывается метод через создание библиотеки классов. В библиотеке описываем метод сериализации и десериализации, а также сам объект (класс), который будет использоваться для передачи от клиента серверу и обратно. Далее, библиотека подключается к клиенту и серверу и используя методы и класс объекта осуществляется передача.
ссылка на источник: Невозможная десериализация другим приложением на этом же форуме. Спасибо всем!
0
Лень — мое второе и
 Аватар для Orlangur
3231 / 2418 / 688
Регистрация: 28.11.2014
Сообщений: 3,603
Записей в блоге: 3
08.10.2015, 15:37
Тут ещё кто-нибудь есть?
Не понял насчет отправки определенному клиенту, с помощью кода
VB.NET
1
2
3
4
5
6
7
Dim Item As DictionaryEntry
        Dim list As Hashtable = server.User_List
 dim client as server.handleClinet
        For Each Item In list ' Перебор всех клиентов и рассылка через Send_user
client=CType(Item.Value, server.handleClinet)
if client.ip = "Нужный ип" then server.Send_user(client, "нужная команда")
        Next
Как это использовать? У меня каждый подключенный клиент отображается в listbox1, но скрутить их вместе я не могу
0
Лень — мое второе и
 Аватар для Orlangur
3231 / 2418 / 688
Регистрация: 28.11.2014
Сообщений: 3,603
Записей в блоге: 3
09.10.2015, 16:36
а все, разобрался)
0
 Аватар для mostApi
8 / 6 / 0
Регистрация: 15.05.2015
Сообщений: 350
14.01.2017, 13:10
KingManiya, при добавлении Вашего кода
Цитата Сообщение от KingManiya Посмотреть сообщение
Public CLIENT As Class_client
из #post2075217 - у меня в vb.net 2015 ошибка (Error BC30002 Type 'Class_client' is not defined.)
Как исправить?
0
Лень — мое второе и
 Аватар для Orlangur
3231 / 2418 / 688
Регистрация: 28.11.2014
Сообщений: 3,603
Записей в блоге: 3
15.01.2017, 02:14
mostApi, так а класс то вставлен?
0
 Аватар для mostApi
8 / 6 / 0
Регистрация: 15.05.2015
Сообщений: 350
18.01.2017, 18:03
Orlangur1991, да, вставлен... разобрался вроде, не внимательный(...

По первому сообщению хочу применить код для Сервера: post2074815 - не обрабатываются события!
Не могу понять что не так... (Везде где вывод сообщения на msg - заменяю на MsgBox - сообщения выводятся...
Так как по коду через event - ничего...
0
 Аватар для mostApi
8 / 6 / 0
Регистрация: 15.05.2015
Сообщений: 350
22.01.2017, 15:41
KingManiya, разобраться, в Вашем коде из первого поста для Сервера у меня не обрабатываются события, не могу понять что не так...
msg заменяю на msgbox - работает, как нужно не отрабатывает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2017, 15:41

Технология создания приложений на основе многоуревневой архитектуры клиент - Web-сервер - сервер баз данных
Технология создания приложений на основе многоуревневой архитектуры клиент Web-сервер – сервер баз данных.

Технология клиент-сервер
Кто может подробно объяснить клиент-сервер технологию? Я не понимаю некоторые вещи . Например , я хочу , чтобы мой сервер работал...

Клиент-сервер, передать строку с клиента на сервер
Подскажите плиз Есть код он передает серверу то что мы пишем с клавиатуры а как передать строку без использования клавиатуры чет...

Клиент-Сервер. Распознавание клиента
День добрый. Подскажите пожалуйста, как сделать так, чтобы при подключении к серверу не одного, а нескольких клиентов, сервер понимал,...

Получить ip адрес клиента (асинхронный клиент - сервер)
Не могу получить ip адрес клиента (асинхронный клиент - сервер) при получении сообщения на стороне клиента. Помогите пожалуйста если кто...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru