Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
.NET 3.x

Клинет-сервер: передача данных по сети

10.12.2011, 12:30. Показов 5698. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Прошу помощи и примеров реализовать следующее.
1) на компьютере в сети делаем сервер на нем должно выполняться следующее:
1.1 менять надпись Label1
1.2 Поддерживал много клиентов
2) Клиенты расположены на разных компьютерах должны выполнят следующее:
2.1 присвоит к себе любой Label (например поставить в клиенте цифру 1 и он отвечает за Label1 на сервере если 2 то Label2)
2.2 при нажатии одной кнопки текст меняется на "выполнено" при другой "выполняю"

прошу помощи,очень надо !
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2011, 12:30
Ответы с готовыми решениями:

Передача данных по сети (клиент-сервер)
Есть клиентское приложение, которое формирует данные в формате xml. Как передать эти данные на серверную часть. Таким образом я создаю...

Сервер программы сетевого чата. Каким способом в нем реализована передача данных по сети?
Это сервер программы сетевого чата.Каким способом тут реализована передача данных по сети? Заранее благодарен за ответ! using System; ...

Клинет-сервер - можно ли реализовать работу на разных портах
:cry:Здравствуйте! Я новичок в Qt, так что простите если мой вопрос глуп и не реализуем. Можно ли реализовать следующие: сервер -...

7
 Аватар для chiribas
12 / 12 / 0
Регистрация: 06.05.2011
Сообщений: 250
10.12.2011, 14:31
Используй контрол mswinsck.ocx.
0
 Аватар для _Лёша_
388 / 377 / 22
Регистрация: 08.02.2011
Сообщений: 1,078
10.12.2011, 21:36
Дальше сам развивай Опять про ограничение строки по сети
1
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
11.12.2011, 18:54  [ТС]
взял отсюда Технология клиент-сервер. Классы клиента и сервера. Обсуждение
Сервер (Сделал 2 формы)
Класс СЕРВЕРА.
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
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
Форма 2
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
Public Class Form2
    Public SERVER As Class_Server
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Блок установки свойств контролов на форме. Нужны 2 Textbox и 3 Button
        With Me
            .Size = New Size(641, 417)
            .Text = "СЕРВЕР"
        End With
 
        With TextBox1
            .Multiline = True
            .ForeColor = Color.Lime
            .BackColor = Color.Black
            .Location = New Point(12, 12)
            .Anchor = 15
            .Size = New Size(601, 300)
        End With
 
        With TextBox2
            .Location = New Point(174, 318)
            .Anchor = 14
            .Size = New Size(439, 20)
        End With
 
        With Button1
            .Size = New Size(75, 49)
            .Location = New Point(12, 318)
            .Text = "Запустить сервер"
            .Anchor = 6
        End With
 
        With Button2
            .Size = New Size(75, 49)
            .Location = New Point(93, 318)
            .Text = "Остановить сервер"
            .Anchor = 6
            .Enabled = False
        End With
 
        With Button3
            .Size = New Size(114, 23)
            .Location = New Point(499, 344)
            .Text = "Отправить всем"
            .Anchor = 10
            .Enabled = False
        End With
 
    End Sub
 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Запуск сервера по клику на кнопке Button1
        SERVER = New Class_Server(13000, "DL", AscW("+")) ' Инициализация сервера
        ' Установка событий класса нужным процедурам. Описание событий в классе.
        AddHandler SERVER.OnRead, AddressOf Me.OnRead
        AddHandler SERVER.Connect, AddressOf Me.Connect
        AddHandler SERVER.Disconnect, AddressOf Me.Disconnect
        AddHandler SERVER.messege, AddressOf Me.msg
 
        SERVER.start() ' Запуск сервера(прослушивание порта)
 
        Button1.Enabled = False ' Блокируем кнопку запуска сервера
        Button2.Enabled = True ' Разблокируем кнопку остановки сервера
        Button3.Enabled = True ' Разблокируем кнопку отправки сообщения
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' Остановка сервера по клику на кнопке Button2
        SERVER.stop_server()
 
        Button1.Enabled = True ' Разблокируем кнопку запуска сервера
        Button2.Enabled = False ' Блокируем кнопку остановки сервера
        Button3.Enabled = False ' Блокируем кнопку отправки сообщения
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        SERVER.Send_all(TextBox1.Text) ' Отправка сообщения из TextBox1 всем клиентам.
    End Sub
 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        SERVER.stop_server() ' При закрытии формы, останавливаем сервер
    End Sub
 
 
    Public Sub Connect(ByVal client As Class_Server.handleClinet) ' Процедура вызываемая при подключении нового клиента
        msg("Оператор №" & client.Number & " подключен." & " IP:" & client.IP) ' Выводим сообщение о подключении клиента, а так же выводим его номер и IP
    End Sub
    Public Sub Disconnect(ByVal client As Class_Server.handleClinet, ByVal reson As String) ' Процедура вызываемая при отключении клиента
        msg("Оператор №" & client.Number & " отключен. Причина: " & reson) ' Выводим сообщение об отключении клиента, а так же выводим его номер и причину.
    End Sub
    Public Sub OnRead(ByVal client As Class_Server.handleClinet, ByVal data As String) ' Процедура вызываемая при получении сервером данных от клиента
        msg("Оператор №" & client.Number & " : " & data) ' Выводим какой клиент и какие данные передал
 
        If data = "PING TEST;" Then ' Если клиент прислал пакет проверки пинга, то отсылаем его обратно.
            SERVER.Send_user(client, data) ' Отправка сообщения от сервера конкретному клиенту
        Else
            ' Отправим обратно клиенту присланные данные, но в верхнем регистре
            SERVER.Send_all(data.ToUpper) ' Отправка сообщения от сервера всем клиентам
            msg("Сервер всем: " & data.ToUpper) ' Вывод этого на экран
        End If
    End Sub
 
 
 
    Private Sub UpdateStatus(ByVal t As String) ' Процедура вывода сообщений в консоль
        Try
            TextBox1.AppendText(vbCrLf & Now & " >> " + t)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
    Public Sub msg(ByVal t As String) ' Процедура выполняемая для вывода сообщения в консоль с синхронизацией потоков
        Try
            If Me.IsHandleCreated Then
                Me.Invoke(New Class_Server.StatusInvoker(AddressOf Me.UpdateStatus), t)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
End Class
на форме 1 распаложены Label1. Label2. Label3 и тд

Клиент
Класс КЛИЕНТА
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
Клинет (1 Форма)
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
Public Class Form1
 
    Public CLIENT As Class_client
    Dim st As New Stopwatch ' Стоп вотчер для замера пинга
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Блок установки свойств контролов на форме. Нужны 3 Textbox и 4 Button
        With Me
            .Size = New Size(383, 140)
            .Text = "Оператор"
        End With
 
        With TextBox1
            .Multiline = True
            .ForeColor = Color.PaleTurquoise
            .BackColor = Color.Black
            .Location = New Point(0, 30)
            .Anchor = 15
            .Size = New Size(380, 50)
        End With
 
        With TextBox2
            .Location = New Point(0, 0)
            .Anchor = 14
            .Size = New Size(100, 20)
            .Visible = False
        End With
 
        With TextBox3
            .Location = New Point(0, 81)
            .Anchor = 6
            .Size = New Size(134, 20)
        End With
 
        With Button1
            .Size = New Size(93, 23)
            .Location = New Point(152, 81)
            .Text = "Подключится"
            .Anchor = 6
        End With
 
        With Button2
            .Size = New Size(93, 23)
            .Location = New Point(251, 81)
            .Text = "Отключиться"
            .Anchor = 6
            .Enabled = False
        End With
 
        With Button3
            .Size = New Size(183, 28)
            .Location = New Point(5, 0)
            .Text = "Свободен"
            .Anchor = 10
            .Enabled = False
        End With
 
        With Button4
            .Size = New Size(142, 28)
            .Location = New Point(194, 0)
            .Text = "Занет"
            .Anchor = 10
            .Enabled = False
        End With
 
        CLIENT = New Class_client ' Инициализируем класс клиента. Иначе форма не закроется, если не подключится хотя бы раз.
    End Sub
 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        CLIENT.Disconnect() ' При закрытии формы, отключаемся
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Подключение к серверу по нажатию кнопки Button1
 
        CLIENT = New Class_client ' Инициализируем класс клиента
        ' Установка событий класса нужным процедурам. Описание событий в классе.
        AddHandler CLIENT.OnRead, AddressOf Me.OnRead_Invoke
        AddHandler CLIENT.Disconnected, AddressOf Me.Disconnect_Invoke
        AddHandler CLIENT.messege, AddressOf Me.msg_Invoke
 
        If CLIENT.Connect(TextBox3.Text, 13000, AscW("+")) Then ' Если подключение удачное выводим сообщение и разблокируем нужные кнопки на форме
            msg("Подключение установленно!")
            Button1.Enabled = False
            Button2.Enabled = True
            Button3.Visible = True
            Button4.Visible = True
            Button3.Enabled = True
            Button4.Enabled = True
        Else
            msg("Не удалось установить подключение!") ' Если подключение не удалось, выводим это.
        End If
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' Отключение от сервера по нажатию кнопки Button2
 
        CLIENT.Disconnect()
        Button1.Enabled = True
        Button2.Enabled = False
        Button3.Visible = True
        Button4.Visible = True
        Button3.Enabled = True
        Button4.Enabled = True
 
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ' Отправка сообщения по нажатию кнопки Button3
        If CLIENT.Send(TextBox2.Text & ";") Then msg("Оператор: " & TextBox2.Text) ' Если посылка сообщения удалась, выводим это
    End Sub
 
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        ' Отправка сообщения по нажатию кнопки Button3
        If CLIENT.Send(TextBox4.Text & ";") Then msg("Оператор: " & TextBox4.Text) ' Если посылка сообщения удалась, выводим это
    End Sub
 
    Private Sub OnRead(ByVal data As String)
        ' Процедура расшифровки принятых данных
        Dim d() As String
        ' Каждый отдельный пакет должен заканчиваться ";",
        ' что бы была возможность в случаее сильной нагрузки на канал,
        ' принимать по нескольку пакетов одновременно
 
        d = Split(data, ";") ' Разбиваем сообщение по ";"
        For x = 0 To d.Length - 1 ' Перебираем все полученные пакеты
            If d(x) <> "" Then ' Если пакет не пустой делаем его обработку
                If Mid(d(x), 1, 9) = "PING TEST" Then ' Если пакет проверки пинга,  
                    st.Stop() 'то останавливаем стопвотчер
                    msg("Пинг: " & st.ElapsedMilliseconds) 'и выводим пинг в милисекундах
                Else ' Иначе
                    msg("Сервер: " & d(x)) ' просто выводим сообщение с сервера
                End If
            End If
        Next
 
    End Sub
    Private Sub OnRead_Invoke(ByVal data As String) ' Процедура получения данных с сервера с синхронизацией потоков
        Try
            If Me.IsHandleCreated Then
                Me.Invoke(New Class_client.StatusInvoker(AddressOf Me.OnRead), data)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
 
    Private Sub Disconnect(ByVal reson As String)
        ' Процедура при отключении клиента
        msg("Подключение разорванно! Причина: " & reson)
        Button1.Enabled = True
        Button2.Enabled = False
        Button3.Enabled = False
        Button4.Enabled = False
    End Sub
    Private Sub Disconnect_Invoke(ByVal t As String) ' Процедура отключения от сервера с синхронизацией потоков
        Try
            If Me.IsHandleCreated Then
                Me.Invoke(New Class_client.StatusInvoker(AddressOf Me.Disconnect), t)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
 
    Private Sub msg(ByVal t As String) ' Процедура вывода сообщений в консоль
        TextBox1.AppendText(vbCrLf & Now & " >> " + t)
    End Sub
    Private Sub msg_Invoke(ByVal t As String) ' Процедура выполняемая для вывода сообщения в консоль с синхронизацией потоков
        Try
            If Me.IsHandleCreated Then
                Me.Invoke(New Class_client.StatusInvoker(AddressOf Me.msg), t)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
 
End Class

подскажите как сделать тут чтобы например 1 клиент при отправки сообщения менял значения в Label1 на Форме 1 , второй клиент в Label2 на форме 1
и Сообщения менялось на "Занят " или "свободен"

Добавлено через 17 часов 41 минуту
ну есть у кого мысли? как сделать так что бы клиент подключившийся под №1 отправлял сообщения только на Form1.Label1.Text под №2 Form1.Label2.Text
0
11.12.2011, 19:23

Не по теме:

Я тебе так скажу (не в обиду) я разбираться в чужом классе не хочу, просто нет времени на это. Если ты хочешь стать программистом а не копипастером, то учи мат часть по вопросу, а судя по тому, что ты спрашиваешь, тебе надо начинать с написания калькулятора, ты выбрал для себя "непосильную" на данном этапе задачу, даже если закончишь проект, то он будет не твой. Всему свое время.

0
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
19.12.2011, 09:50  [ТС]
Большое спасибо KingManiya за помощь! Все сделал
0
19.12.2011, 10:59
 Комментарий модератора 
Цитата Сообщение от Faraon Посмотреть сообщение
Большое спасибо KingManiya за помощь! Все сделал
Вы б на форуме решали такие вопросы, а не в личке. Кто-то потом будет искать похожую информацию и наткнется на подобное
0
 Аватар для Faraon
26 / 25 / 9
Регистрация: 17.09.2011
Сообщений: 143
19.12.2011, 11:41  [ТС]
Да может кому и пригодится! Выложу

Module1 загружем из ini инфу
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
Module Module1
    Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Integer
    Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
    Public Function GetValue(ByVal Section As String, ByVal Key As String, ByVal fFileName As String, Optional ByVal DefaultValue As String = vbNullString) As String
        Dim Data As String
        Data = New String(Chr(0), 1000)
        If GetPrivateProfileString(Section, Key, DefaultValue, Data, 1000, fFileName) > 0 Then
            GetValue = Left(Data, InStr(Data, Chr(0)) - 1)
        Else
            GetValue = DefaultValue
        End If
        Exit Function
    End Function
 
    Sub saveIni(ByRef razdel As String, ByRef param As Object, ByRef znach As String)
        ' Сохраняем настройки
        WritePrivateProfileString(razdel, param, znach, ".\options.ini")
    End Sub
 
    Public Function readIni(ByRef razdel As String, ByRef param As Object) As String
        ' Читаем настройки
        readIni = GetValue(razdel, param, ".\options.ini", "0")
    End Function
End Module
options.ini содержит
[Main]
id=Оператор:06
ip=localhost
port=13000
Класс КЛИЕНТА остался прежним как в примере выше
Клинет (1 Форма)
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
Public Class Form1
  
 
 
    Public CLIENT As Class_client
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
    End Sub
 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If MessageBox.Show("Вы действительно хотите закрыть программу?", "Внимание", MessageBoxButtons.YesNo) = MsgBoxResult.No Then
            e.Cancel = True
        Else
            CLIENT.Send("Status:02")
            CLIENT.Disconnect() ' При закрытии формы, отключаемся
        End If
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        CLIENT.Send("Status:01")
        Button2.Enabled = True : Button2.BackColor = Color.Red
        Button1.Enabled = False : Button1.BackColor = Color.Silver
 
 
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        CLIENT.Send("Status:02")
        Button2.Enabled = False : Button2.BackColor = Color.Silver
        Button1.Enabled = True : Button1.BackColor = Color.Lime
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        CLIENT.Send("Status:03")
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        sender.stop()
 
 
        CLIENT = New Class_client ' Инициализируем класс клиента
        ' Установка событий класса нужным процедурам. Описание событий в классе.
        '  AddHandler CLIENT.OnRead, AddressOf Me.OnRead_Invoke
        '   AddHandler CLIENT.Disconnected, AddressOf Me.Disconnect_Invoke
        'AddHandler CLIENT.messege, AddressOf Me.msg_Invoke
 
        If CLIENT.Connect(readIni("Main", "ip"), readIni("Main", "port"), AscW("+")) Then ' Если подключение удачное выводим сообщение и разблокируем нужные кнопки на форме
 
        Else
            MsgBox("Не удалось установить подключение!") ' Если подключение не удалось, выводим это.
            Me.Close()
        End If
 
        Button1.Enabled = True
        Button2.Enabled = True
        Me.Text = readIni("Main", "id")
        If CLIENT.Send(Me.Text) = False Then MsgBox("Ошибка")
    End Sub
 
 
 
    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.Hide()
        NotifyIcon1.Visible = True
    End Sub
    Private Sub NotifyIcon1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.Click
        Me.Show()
        Me.WindowState = FormWindowState.Normal
    End Sub
End Class
Сервер form1
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
Public Class Form1
    Public SERVER As Class_Server
 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        SERVER.stop_server() ' При закрытии формы, останавливаем сервер
    End Sub
    'Public Sub Connect(ByVal client As Class_Server.handleClinet) ' Процедура вызываемая при подключении нового клиента
    '    msg("Клиент №" & client.Number & " подключен." & " IP:" & client.IP) ' Выводим сообщение о подключении клиента, а так же выводим его номер и IP
    'End Sub
    'Public Sub Disconnect(ByVal client As Class_Server.handleClinet, ByVal reson As String) ' Процедура вызываемая при отключении клиента
    '    msg("Клиент №" & client.Number & " отключен. Причина: " & reson) ' Выводим сообщение об отключении клиента, а так же выводим его номер и причину.
    'End Sub
    Public Sub OnRead(ByVal client As Class_Server.handleClinet, ByVal data As String) ' Процедура вызываемая при получении сервером данных от клиента
        ' msg("Клиент №" & client.Number & " : " & data) ' Выводим какой клиент и какие данные передал
        If data.Substring(0, 9) = "Оператор:" Then client.Number = data.Substring(9, 2)
        If data.Substring(0, 7) = "Status:" And client.Number <> -1 Then
            msg(data.Substring(7, 2), client.Number)
        End If
 
    End Sub
 
 
 
    Private Sub UpdateStatus(ByVal t As String, ByVal n As Integer) ' Процедура вывода сообщений в консоль
        Try
            If t = 1 Then Me.Controls("TextBox" & n).Text = "Свободно" : Me.Controls("TextBox" & n).ForeColor = Color.Lime
            If t = 2 Then Me.Controls("TextBox" & n).Text = "Занято" : Me.Controls("TextBox" & n).ForeColor = Color.Red
            If t = 3 Then Me.Controls("TextBox" & n).Text = "Нет на месте" : Me.Controls("TextBox" & n).ForeColor = Color.Black
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
    Public Sub msg(ByVal t As String, ByVal n As Integer) ' Процедура выполняемая для вывода сообщения в консоль с синхронизацией потоков
        Try
            If Me.IsHandleCreated Then
                Me.Invoke(New Class_Server.StatusInvoker(AddressOf Me.UpdateStatus), {t, n})
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 
   
    Private Sub ВыходToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ВыходToolStripMenuItem.Click
        Me.Close()
    End Sub
 
    Private Sub ЗапускToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ЗапускToolStripMenuItem.Click
        ' Запуск сервера по клику на кнопке Button1
 
 
        SERVER = New Class_Server(13000, "Очередь", AscW("+")) ' Инициализация сервера
        ' Установка событий класса нужным процедурам. Описание событий в классе.
        AddHandler SERVER.OnRead, AddressOf Me.OnRead
        'AddHandler SERVER.Connect, AddressOf Me.Connect
        'AddHandler SERVER.Disconnect, AddressOf Me.Disconnect
        '  AddHandler SERVER.messege, AddressOf Me.msg
 
        SERVER.start() ' Запуск сервера(прослушивание порта)
    End Sub
 
    Private Sub ОстоновитьToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ОстоновитьToolStripMenuItem.Click
        ' Остановка сервера по клику на кнопке Button2
        SERVER.stop_server()
    End Sub
End Class
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
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
Imports System.Net.Sockets
 
Public Class Class_Server
    Public Delegate Sub StatusInvoker(ByVal t As String, ByVal n As Integer) ' делегат для синхронизации при выводе сообщений
 
 
    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, -1) ' Создаем новый класс клиента и передаем ему подключившегося клиента и его номер подключения
                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 Property Number() As String ' Получение номера клиента 
            Get
                Return clNo.ToString
            End Get
            Set(ByVal value As String)
                clNo = value
            End Set
        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
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2011, 11:41
Помогаю со студенческими работами здесь

Передача фото по сети на сервер
У меня такая задача : нужно реализовать такое приложение чтобы водитель мог сфотографировать на улице обьект здание и тп и фото этого...

Клиент сервер, передача файлов по сети
Здравствуйте. Как можно организовать работу приложения чтобы клиент получал от сервера хранящиеся на нем файлы,т.е. выполнить команду,а...

Способы шифрование данных. Передача данных на сервер в зашифрованном виде
Всем привет Хотелось бы услышать мнение опытных программистов о методах шифрования или о способах передачи данных от программы до сайта в...

При передаче данных по локальной сети на сервер в базу sql передается только часть данных
Всем доброго времени суток! У меня ситуация такая – есть своя программа на Delphi 2010 для перегонки данных из html-файлов в базу на sql...

Передача данных по сети с задержкой. Как корректно передать размер данных до самого сообщения? Делаю на сокетах
Клиент отправляет запрос, сервер возвращает скрин. На создание уходит время, и цикл передачи do {} while (handler.Available &gt; 0) ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru