Hallo liebe Community,
ich habe vor einigen Wochen im Internet folgenden Code gefunden, ganz folgen kann ich allerdings nicht.
Der server reagiert auf eine anfrage vom clienten mit einer antwort... soweit sogut, nun frage ich mich aber wie bzw wo
kann ich eine bestimmte Verbindung ansprechen die im Pool ist.
beispielsweise eine private nachricht von client1 zu client2... ist dies mit dem server machbar
desweiteren ist mir aufgefallen das der Server Exceptions wirft sobald ein Client verbunden ist was wohl mit dem "TimeOut" der verbindung zu tun hat... dennoch arbeitet der server weiter und unterbricht keine verbindugnen ( ist ja auch nicht eingestellt wie man sehen kann) dennoch frage ich mich ob das so richtig ist
schaut euch den code einfachmal an...
ich freue mich über jede hilfe die mir gegeben werden kann
LG
Marvin
Server
Spoiler anzeigen
Client
Spoiler anzeigen
ich habe vor einigen Wochen im Internet folgenden Code gefunden, ganz folgen kann ich allerdings nicht.
Der server reagiert auf eine anfrage vom clienten mit einer antwort... soweit sogut, nun frage ich mich aber wie bzw wo
kann ich eine bestimmte Verbindung ansprechen die im Pool ist.
beispielsweise eine private nachricht von client1 zu client2... ist dies mit dem server machbar
desweiteren ist mir aufgefallen das der Server Exceptions wirft sobald ein Client verbunden ist was wohl mit dem "TimeOut" der verbindung zu tun hat... dennoch arbeitet der server weiter und unterbricht keine verbindugnen ( ist ja auch nicht eingestellt wie man sehen kann) dennoch frage ich mich ob das so richtig ist
schaut euch den code einfachmal an...
ich freue mich über jede hilfe die mir gegeben werden kann
LG
Marvin
Server
VB.NET-Quellcode
- Imports System
- Imports System.IO
- Imports System.Net.Sockets
- Imports System.Text
- Imports System.Collections
- Imports System.Threading
- Friend Class ClientConnectionPool
- ' Creates a synchronized wrapper around the Queue.
- Private SyncdQ As Queue = Queue.Synchronized(New Queue())
- Public Sub Enqueue(ByVal client As ClientHandler)
- SyncdQ.Enqueue(client)
- End Sub
- Public Function Dequeue() As ClientHandler
- Return DirectCast(SyncdQ.Dequeue(), ClientHandler)
- End Function
- Public ReadOnly Property Count() As Integer
- Get
- Return SyncdQ.Count
- End Get
- End Property
- Public ReadOnly Property SyncRoot() As Object
- Get
- Return SyncdQ.SyncRoot
- End Get
- End Property
- End Class ' class ClientConnectionPool
- Friend Class ClientService
- Private Const NUM_OF_THREAD As Integer = 10
- Private ConnectionPool As ClientConnectionPool
- Private ContinueProcess As Boolean = False
- Private ThreadTask(NUM_OF_THREAD - 1) As Thread
- Public Sub New(ByVal ConnectionPool As ClientConnectionPool)
- Me.ConnectionPool = ConnectionPool
- End Sub
- Public Sub Start()
- ContinueProcess = True
- ' Start threads to handle Client Task
- For i As Integer = 0 To ThreadTask.Length - 1
- ThreadTask(i) = New Thread(New ThreadStart(AddressOf Me.Process))
- ThreadTask(i).Start()
- Next i
- End Sub
- Private Sub Process()
- Do While ContinueProcess
- Dim client As ClientHandler = Nothing
- SyncLock ConnectionPool.SyncRoot
- If ConnectionPool.Count > 0 Then
- client = ConnectionPool.Dequeue()
- End If
- End SyncLock
- If client IsNot Nothing Then
- client.Process() ' Provoke client
- ' if client still connect, schedufor later processingle it
- If client.Alive Then
- ConnectionPool.Enqueue(client)
- End If
- End If
- Thread.Sleep(100)
- Loop
- End Sub
- Public Sub [Stop]()
- ContinueProcess = False
- For i As Integer = 0 To ThreadTask.Length - 1
- If ThreadTask(i) IsNot Nothing AndAlso ThreadTask(i).IsAlive Then
- ThreadTask(i).Join()
- End If
- Next i
- ' Close all client connections
- Do While ConnectionPool.Count > 0
- Dim client As ClientHandler = ConnectionPool.Dequeue()
- client.Close()
- Console.WriteLine("Client connection is closed!")
- Loop
- End Sub
- End Class ' class ClientService
- Public Class SynchronousSocketListener
- Private Const portNum As Integer = 10116
- Public Shared Sub StartListening()
- Dim ClientTask As ClientService
- ' Client Connections Pool
- Dim ConnectionPool As New ClientConnectionPool()
- ' Client Task to handle client requests
- ClientTask = New ClientService(ConnectionPool)
- ClientTask.Start()
- Dim listener As New TcpListener(portNum)
- Try
- listener.Start()
- Dim TestingCycle As Integer = 3 ' Number of testing cycles
- Dim ClientNbr As Integer = 0
- ' Start listening for connections.
- Console.WriteLine("Waiting for a connection...")
- Do While TestingCycle > 0
- Dim handler As TcpClient = listener.AcceptTcpClient()
- If handler IsNot Nothing Then
- ClientNbr += 1
- Console.WriteLine("Client#{0} accepted!", ClientNbr)
- ' An incoming connection needs to be processed.
- ConnectionPool.Enqueue(New ClientHandler(handler))
- TestingCycle -= 1
- Else
- Exit Do
- End If
- Loop
- listener.Stop()
- ' Stop client requests handling
- ClientTask.Stop()
- Catch e As Exception
- Console.WriteLine(e.ToString())
- End Try
- Console.WriteLine(ControlChars.Lf & "Hit enter to continue...")
- Console.Read()
- End Sub
- Public Shared Function Main(ByVal args() As String) As Integer
- StartListening()
- Return 0
- End Function
- End Class
- Friend Class ClientHandler
- Private ClientSocket As TcpClient
- Private networkStream As NetworkStream
- Private ContinueProcess As Boolean = False
- Private bytes() As Byte ' Data buffer for incoming data.
- Private sb As New StringBuilder() ' Received data string.
- Private data As String = Nothing ' Incoming data from the client.
- Public Sub New(ByVal ClientSocket As TcpClient)
- ClientSocket.ReceiveTimeout = 100 ' 100 miliseconds
- Me.ClientSocket = ClientSocket
- networkStream = ClientSocket.GetStream()
- bytes = New Byte(ClientSocket.ReceiveBufferSize - 1){}
- ContinueProcess = True
- End Sub
- Public Sub Process()
- Try
- Dim BytesRead As Integer = networkStream.Read(bytes, 0, CInt(bytes.Length))
- If BytesRead > 0 Then
- ' There might be more data, so store the data received so far.
- sb.Append(Encoding.ASCII.GetString(bytes, 0, BytesRead))
- Else
- ' All the data has arrived; put it in response.
- ProcessDataReceived()
- End If
- Catch e1 As IOException
- ' All the data has arrived; put it in response.
- ProcessDataReceived()
- Catch e2 As SocketException
- networkStream.Close()
- ClientSocket.Close()
- ContinueProcess = False
- Console.WriteLine("Conection is broken!")
- End Try
- End Sub ' Process()
- Private Sub ProcessDataReceived()
- If sb.Length > 0 Then
- Dim bQuit As Boolean = (String.Compare(sb.ToString(), "quit", True) = 0)
- data = sb.ToString()
- sb.Length = 0 ' Clear buffer
- Console.WriteLine("Text received from client:")
- Console.WriteLine(data)
- Dim response As New StringBuilder()
- response.Append("Received at ")
- response.Append(Date.Now.ToString())
- response.Append(ControlChars.CrLf)
- response.Append(data)
- ' Echo the data back to the client.
- Dim sendBytes() As Byte = Encoding.ASCII.GetBytes(response.ToString())
- networkStream.Write(sendBytes, 0, sendBytes.Length)
- ' Client stop processing
- If bQuit Then
- networkStream.Close()
- ClientSocket.Close()
- ContinueProcess = False
- End If
- End If
- End Sub
- Public Sub Close()
- networkStream.Close()
- ClientSocket.Close()
- End Sub
- Public ReadOnly Property Alive() As Boolean
- Get
- Return ContinueProcess
- End Get
- End Property
- End Class ' class ClientHandler
Client
VB.NET-Quellcode
- Imports System
- Imports System.Net.Sockets
- Imports System.Text
- Friend Class TcpClientTest
- Private Const portNum As Integer = 10116
- Public Shared Sub Main()
- Dim tcpClient As New TcpClient()
- Try
- tcpClient.Connect("localhost", portNum)
- Dim networkStream As NetworkStream = tcpClient.GetStream()
- If networkStream.CanWrite AndAlso networkStream.CanRead Then
- Dim DataToSend As String = ""
- Do While DataToSend <> "quit"
- Console.WriteLine(ControlChars.Lf & "Type a text to be sent:")
- DataToSend = Console.ReadLine()
- If DataToSend.Length = 0 Then
- Exit Do
- End If
- Dim sendBytes() As Byte = Encoding.ASCII.GetBytes(DataToSend)
- networkStream.Write(sendBytes, 0, sendBytes.Length)
- ' Reads the NetworkStream into a byte buffer.
- Dim bytes(tcpClient.ReceiveBufferSize - 1) As Byte
- Dim BytesRead As Integer = networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
- ' Returns the data received from the host to the console.
- Dim returndata As String = Encoding.ASCII.GetString(bytes, 0, BytesRead)
- Console.WriteLine("This is what the host returned to you: " & ControlChars.CrLf & "{0}", returndata)
- Loop
- networkStream.Close()
- tcpClient.Close()
- ElseIf Not networkStream.CanRead Then
- Console.WriteLine("You can not write data to this stream")
- tcpClient.Close()
- ElseIf Not networkStream.CanWrite Then
- Console.WriteLine("You can not read data from this stream")
- tcpClient.Close()
- End If
- Catch e1 As SocketException
- Console.WriteLine("Sever not available!")
- Catch e2 As System.IO.IOException
- Console.WriteLine("Sever not available!")
- Catch e As Exception
- Console.WriteLine(e.ToString())
- End Try
- End Sub ' Main()
- End Class ' class TcpClientTest {
Imperiums - Fortschritt in ein neues Zeitalter (Remake 2021)