Я работаю над проектом, в котором есть сервер, когда клиент подключается, он сохраняет свой user_id
, ip в словаре, который я использовал. Когда я храню информацию между различными потоками, она работает, но когда я пытаюсь получить доступ к словарю из разных потоков, она не работает хорошо.
Позвольте мне пояснить, что должен делать мой код: существует один основной поток, активный и прослушивающий клиентов, когда клиенты хотят подключиться, основной поток создает дочерний поток, и этот поток связывается с клиентом, клиент отправляет ему user_id
, user_id
(в качестве ключа для словаря) и Tcpclient
(в качестве значения) сохраняются в словаре. Далее один клиент отправляет сообщение для конкретного клиента на сервер, которое содержит user_id
для получателя. Теперь этот клиент связан с определенным потоком, который проверит ключ (user_id
) в словаре и затем отправит данные этому клиенту, но словарь не дает правильное значение для подключенных клиентов, он просто возвращает false, даже если клиент подключен.
Ниже приведен пример кода.
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Public Class Mainform
Dim _server As TcpListener
Dim _listOfClients As New Dictionary(Of String, TcpClient)
Public MessageQueue As New Dictionary(Of String, Queue(Of String))
'Dim ClientData As StreamReader
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Dim port As Integer = 8888
_server = New TcpListener(System.Net.IPAddress.Any, port)
_server.Start()
Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub NewClient()
Dim client As TcpClient = _server.AcceptTcpClient()
Dim toRec(100000) As Byte
Dim nss As NetworkStream = client.GetStream()
nss.Read(toRec, 0, toRec.Length)
Dim ClientData As String = Encoding.ASCII.GetString(toRec)
MsgBox("Client Connected: " & ClientData)
Dim too() As String
Dim status As Boolean = False
Dim sendto As String
Try
_listOfClients.Add(ClientData, client)
Threading.ThreadPool.QueueUserWorkItem(AddressOf NewClient)
While True
Dim thisClient As String = ClientData
Dim ns As NetworkStream = client.GetStream()
Dim toRecieve(100000) As Byte
ns.Read(toRecieve, 0, toRecieve.Length)
Dim txt As String = Encoding.ASCII.GetString(toRecieve)
'MsgBox(txt)
too = txt.Split("@") 'server receives data in single string where user_id and message is connected with '@'
sendto = String.Copy(too(0)) 'this is the user_id of receiver client
If _listofclients.ContainsKey(sendto) Then
Dim data As String
data = String.Join("#", too)
Dim buffer As Byte() = Encoding.ASCII.GetBytes(data)
Dim nets As NetworkStream = _listofclients(sendto).GetStream()
nets.Write(buffer, 0, buffer.Length)
End If
End While
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class