サーバーを持つプロジェクトに取り組んでいます。クライアントが接続するたびに、user_id
使用した辞書にそのIPが保存されます。異なるスレッド間で情報を保存すると機能しますが、異なるスレッドから辞書にアクセスしようとするとうまく機能しません。
私のコードが何をすべきかを明確にしましょう: 1 つのメイン スレッドがアクティブで、クライアントをリッスンしています。クライアントが接続する必要がある場合、メイン スレッドが子スレッドを作成し、そのスレッドがクライアントに接続され、クライアントがそれにuser_id
, this user_id
(キーとして) を送信します。ディクショナリの場合) およびTcpclient
(値として) ディクショナリに格納されます。さらに、1 つのクライアントが特定のクライアントのメッセージをサーバーに送信します。そのメッセージにはuser_id
、受信者用の が含まれています。現在、このクライアントは、辞書の key( ) をチェックしてからそのクライアントにデータを送信する特定のスレッドに接続されて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