Почему не работает клиент-сервер
15.03.2011, 20:21. Показов 1462. Ответов 0
Переделываю под себя найденый на форуме текст:
Сервер: Код:
| 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
| Imports system.net
Public Class Form1
Dim Client_UDP_output As New System.Net.Sockets.UdpClient
Dim Client_UDP_input As New System.Net.Sockets.UdpClient(10101)
Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)
Dim ListenerThread As Threading.Thread
Dim polsovatel(100, 1) As String
Dim i As Net.IPHostEntry = Net.Dns.GetHostByName(Net.Dns.GetHostName)
Dim NickName As String, IPServ As String = "192.168.0.146"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
sendTXT("MSG|" & NickName & ": " & TextBox1.Text, IPServ, 10101)
End Sub
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Me.Client_UDP_input.Close()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'NickName = InputBox("Введите ваш никнайм", "NickName", "Server")
NickName = "Server"
'sendTXT("NU|" & NickName & "|" & i.AddressList(0).ToString, IPServ, 10101)
Me.start_thread()
End Sub
Sub sendTXT(ByVal xTxt As String, ByVal Ip As String, Optional ByVal Port As Integer = 4321)
Try
Dim sendBytes As [Byte]() = System.Text.Encoding.Default.GetBytes(xTxt)
Client_UDP_output.Send(sendBytes, sendBytes.Length, New IPEndPoint(IPAddress.Parse(Ip), Port)) ' "188.187.167.236"
Client_UDP_output = New System.Net.Sockets.UdpClient
Catch ex As Exception
Me.ReturnData_toMainThread(ex.Message)
End Try
End Sub
Private Sub start_thread()
Try
ListenerThread = New Threading.Thread(AddressOf DoListen)
ListenerThread.Start()
'Me.TextBox2.Text &= "Сервер вроде запущен"
Catch ex As Exception
Me.TextBox2.Text &= ex.Message
End Try
End Sub
Private Sub DoListen()
Do While Not ListenerThread Is Nothing
Try
Dim receiveBytes As Byte() = Client_UDP_input.Receive(RemoteIpEndPoint)
Dim returnData As String = System.Text.Encoding.Default.GetString(receiveBytes)
Dim o() As String, raz As Boolean = False, count As Integer = 0
o = Split(returnData, "|")
If o(0) = "NU" Then
'ListBox1.Items.Add(returnData)
For ich As Integer = 1 To 100
If Len(polsovatel(ich, 0)) = 0 And Not raz Then
polsovatel(ich, 0) = o(1)
polsovatel(ich, 1) = o(2)
raz = True
ElseIf Len(polsovatel(ich, 0)) > 0 Then
count += 1
sendTXT(returnData, polsovatel(ich, 1))
End If
'ListBox1.Items.Add(returnData)
Next
ElseIf o(0) = "MSG" Then
Dim pos(100) As String
For ich As Integer = 1 To 100
If Len(polsovatel(ich, 0)) > 0 Then
raz = True
For ij As Integer = 1 To 100
If polsovatel(ich, 1) = pos(ij) Then raz = False
Next
If raz Then
count += 1
sendTXT(returnData, polsovatel(ich, 1))
pos(ich) = polsovatel(ich, 1)
Me.ReturnData_toMainThread(polsovatel(ich, 0) & " IP " & polsovatel(ich, 1))
End If
End If
Next
ElseIf o(0) = "EX" Then
For ich As Integer = 1 To 100
If polsovatel(ich, 1) = o(1) Then
polsovatel(ich, 0) = vbNullString
polsovatel(ich, 1) = vbNullString
ElseIf Len(polsovatel(ich, 1)) > 0 Then
sendTXT(returnData, polsovatel(ich, 1))
End If
Next
ElseIf o(0) = "RE" Then
Dim snd As String = vbNullString
For ich As Integer = 1 To 100
If ich > 1 Then snd &= "|"
If Len(polsovatel(ich, 0)) > 0 Then
snd &= polsovatel(ich, 0) & ":" & polsovatel(ich, 1)
End If
Next
sendTXT("RE|" & snd, o(1))
End If
'Me.ReturnData_toMainThread(returnData & " получили " & count)
Me.ReturnData_toMainThread(returnData)
Catch ex As Exception
ListenerThread.Abort()
Me.ReturnData_toMainThread(ex.Message)
End Try
Loop
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.ListenerThread.Abort()
Me.Client_UDP_input.Close()
Me.Client_UDP_input = New System.Net.Sockets.UdpClient(10101)
Me.start_thread()
End Sub
'=====================================
Private Delegate Sub MSG_Delegate(ByVal Text As String)
Private Sub ReturnData_toMainThread(ByVal Text As String)
' является ли вызвавший поток родным потоком окна?
If Not Me.InvokeRequired Then
' вызвать родной, незащищенный метод формы
'!!!!!!!!!!! Здесь мы читаем то что пришло серверу....
'If Len(TextBox2.Text) > 500 Then TextBox2.Text = vbNullString
Me.TextBox2.Text &= Text
If Mid(TextBox2.Text, 1, 2) = "NU" Then Me.NewUser()
If Mid(TextBox2.Text, 1, 2) = "EX" Then Me.ExitUser()
TextBox2.Text = ""
Else
' косвенный вызов метода
Dim d As System.Delegate = New MSG_Delegate(AddressOf ReturnData_toMainThread)
' асинхронно вызвать этот же метод, с теми же параметрами.
Me.BeginInvoke(d, New String() {Text})
End If
End Sub
Private Sub NewUser()
ListBox1.Items.Add(Mid(TextBox2.Text, 4))
sendTXT("OK=", IPServ, 10101)
'MsgBox("Отправил")
End Sub
Private Sub ExitUser()
ListBox1.Items.Add("Юзер вышел")
End Sub
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
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
| Imports system.net
Public Class Form1
Dim Client_UDP_output As New System.Net.Sockets.UdpClient
Dim Client_UDP_input As New System.Net.Sockets.UdpClient
Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)
Dim ListenerThread As Threading.Thread
Dim polsovatel(100, 1) As String
Dim i As Net.IPHostEntry = Net.Dns.GetHostByName(Net.Dns.GetHostName)
Dim NickName As String, IPServ As String = "192.168.0.146"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
sendTXT("EX|" & TextBox1.Text, IPServ, 10101)
TextBox1.Text = vbNullString
End Sub
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
'sendTXT("RE|" & i.AddressList(0).ToString, IPServ, 10101)
End Sub
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
sendTXT("EX|" & i.AddressList(0).ToString, IPServ, 10101)
Me.Client_UDP_input.Close()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
On Error Resume Next
Client_UDP_input.ExclusiveAddressUse = False
Client_UDP_output.ExclusiveAddressUse = False
Client_UDP_input.Close()
Client_UDP_output.Close()
Client_UDP_output = New System.Net.Sockets.UdpClient
Client_UDP_input = New System.Net.Sockets.UdpClient(4321)
'NickName = InputBox("Введите ваш никнайм", "NickName", "NewUser")
TextBox2.Text = ""
sendTXT("NU=" & i.AddressList(0).ToString, IPServ, 10101)
Me.start_thread()
End Sub
Sub sendTXT(ByVal xTxt As String, ByVal Ip As String, Optional ByVal Port As Integer = 10101)
Dim sendBytes As [Byte]() = System.Text.Encoding.Default.GetBytes(xTxt)
Client_UDP_output.Send(sendBytes, sendBytes.Length, New IPEndPoint(IPAddress.Parse(Ip), Port)) ' "188.187.167.236"
End Sub
Private Sub start_thread()
Try
ListenerThread = New Threading.Thread(AddressOf DoListen)
ListenerThread.Start()
'Me.TextBox2.Text &= "[Прослушивание сообщений] mode ON"
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Sub AddUsrs()
Me.ReturnData_toMainThread("|CLEAR|", False)
For iss As Integer = 1 To 100
If Len(polsovatel(iss, 0)) > 0 Then
Me.ReturnData_toMainThread(polsovatel(iss, 0), False)
End If
Next
End Sub
Private Sub DoListen()
Do While Not ListenerThread Is Nothing
Try
Dim receiveBytes As Byte() = Client_UDP_input.Receive(RemoteIpEndPoint)
Dim returnData As String = System.Text.Encoding.Default.GetString(receiveBytes)
Dim o() As String, raz As Boolean
TextBox2.Text = returnData
If TextBox2.Text = "OK=" Then MsgBox("OK")
'o = Split(returnData, "|")
'If o(0) = "NU" Then
' For ich As Integer = 1 To 100
' If Len(polsovatel(ich, 0)) = 0 And Not raz Then
' polsovatel(ich, 0) = o(1)
' polsovatel(ich, 1) = o(2)
' raz = True
' AddUsrs()
' End If
' Next
' ElseIf o(0) = "MSG" Then
' Me.ReturnData_toMainThread(o(1), True)
' ElseIf o(0) = "EX" Then
' For ich As Integer = 1 To 100
' If polsovatel(ich, 1) = o(1) Then
' polsovatel(ich, 0) = vbNullString
' polsovatel(ich, 1) = vbNullString
'End If
' Next
' AddUsrs()
' ElseIf o(0) = "RE" Then
''Dim snd() As String = Split(o(1), "|")
'For ich As Integer = 0 To snd.Length - 1
' Dim jk() As String = Split(snd(ich), ":")
' polsovatel(ich + 1, 0) = jk(0)
' polsovatel(ich + 1, 1) = jk(1)
' Next
' AddUsrs()
' End If
Catch ex As Exception
ListenerThread.Abort()
Me.ReturnData_toMainThread(ex.Message, True)
End Try
Loop
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.ListenerThread.Abort()
End Sub
'=====================================
Private Delegate Sub MSG_Delegate(ByVal Text As String, ByVal oop As String)
Private Sub ReturnData_toMainThread(ByVal Text As String, ByVal oop As String)
' является ли вызвавший поток родным потоком окна?
If Not Me.InvokeRequired Then
' вызвать родной, незащищенный метод формы
If oop = True Then
'Me.TextBox2.Text &= vbNewLine & Text
'If Len(TextBox2.Text) > 500 Then TextBox2.Text = Mid(TextBox2.Text, 400)
'TextBox2.SelectionStart = Len(TextBox2.Text)
'TextBox2.ScrollToCaret()
If TextBox2.Text = "OK=" Then MsgBox("OK")
Else
If Text = "|CLEAR|" Then
ListBox1.Items.Clear()
Else
ListBox1.Items.Add(Text)
End If
End If
Else
If TextBox2.Text = "OK=" Then MsgBox("OK")
' косвенный вызов метода
Dim d As System.Delegate = New MSG_Delegate(AddressOf ReturnData_toMainThread)
' асинхронно вызвать этот же метод, с теми же параметрами.
Me.BeginInvoke(d, New String() {Text, oop})
End If
End Sub
Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
If e.KeyData = Keys.Enter Then
sendTXT("MSG|" & NickName & ": " & TextBox1.Text, IPServ, 10101)
TextBox1.Text = vbNullString
End If
End Sub
End Class |
|
Уже мозги пухнут. Сервер видит клиента отлично. НО по идее при приходе от клиента текста (в начале NU) должен отправить " OK=", вроде как отправляет, но клиент (по идее должен показать MsgBox) не реагирует...
0
|