Thanks for the people that answered my question before, but I ended up
redoing it all with sockets instead of a tcplistener. Anyway I have spent
the last 2 weeks working on this and it is driving me insane. Sorry I
don't have anyone else to turn to so I hope you guys can be helpful ^.^;
Anyway the listener class seems to work fine, it accepts connections and
everything nicely. Occasionally I get the first line of stuff sent from
the client, but otherwise both the sending and receiving of the socket
stream die after that. I can't read anything from it nor send anything at
all. Anyways, as I have said I've been working on this a very long time
and cant figure it out. Thanks for reading this everyone ^.^ The whole
darn namespace follows:
Option Explicit On
Option Strict On
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Imports System.Collections
Namespace GsSockets
#Region " Deligates "
Public Delegate Sub DataArrivalDelegate(ByVal RequestID As Integer,
ByVal Data As String)
Public Delegate Sub DisconnectedDelegate(ByVal RequestID As Integer)
#End Region
Public Class SocketServer
Private sckListener As TcpListener
Private trdListener As Thread
Private objClientPool As ClientPool
Private intListenPort As Integer
' Fired when a new client connects.
Public Event ClientConnected(ByVal RequestID As Integer)
Public Event DataArrival As DataArrivalDelegate
Public Event ClientDisconnected As DisconnectedDelegate
Public Sub New()
End Sub
Public Sub Listen(ByVal ListenPort As Integer)
intListenPort = ListenPort
objClientPool = New ClientPool()
trdListener = New Thread(AddressOf ListenThread)
trdListener.Start()
End Sub
Private Sub ListenThread()
Try
sckListener = New TcpListener(intListenPort)
sckListener.Start()
Catch ex As Exception
MsgBox("Listen Error")
' TODO: Error Handling
Exit Sub
End Try
Do While True
Dim sckClient As Socket = sckListener.AcceptSocket()
If sckClient.Connected Then
Dim objConnectedSocket As New Client(sckClient)
objClientPool.Add(CType(sckClient.Handle.ToInt32,
Integer), objConnectedSocket)
AddHandler objConnectedSocket.DataArrival, AddressOf
DataArrivalMethod
AddHandler objConnectedSocket.ClientDisconnected,
AddressOf ClientDisconnectedMethod
RaiseEvent ClientConnected(CType
(sckClient.Handle.ToInt32, Integer))
End If
Loop
End Sub
Public Sub Close()
sckListener.Stop()
trdListener.Abort()
Try
objClientPool.Dispose()
Catch
End Try
End Sub
Public Sub Disconnect(ByVal RequestID As Integer)
objClientPool.Remove(RequestID)
End Sub
Public Sub SendData(ByVal RequestID As Integer, ByVal Data As
String)
objClientPool.SendData(RequestID, Data)
End Sub
Public Sub Broadcast(ByVal Data As String)
objClientPool.Broadcast(Data)
End Sub
Private Sub DataArrivalMethod(ByVal RequestID As Integer, ByVal
Data As String)
RaiseEvent DataArrival(RequestID, Data)
End Sub
Private Sub ClientDisconnectedMethod(ByVal RequestID As Integer)
RaiseEvent ClientDisconnected(RequestID)
End Sub
End Class
Public Class ClientPool
Private ClientTable As New Hashtable()
Public Sub Add(ByVal RequestID As Integer, ByVal Socket As
Client)
Try
ClientTable.Add(RequestID, Socket)
Catch ex As Exception
' TODO: Error handling
End Try
End Sub
Public Sub Remove(ByVal RequestID As Integer)
Try
Dim connectedSocket As Client = CType(ClientTable.Item
(RequestID), Client)
connectedSocket.CloseSocket()
ClientTable.Remove(RequestID)
Catch ex As Exception
' TODO: Error Handling
End Try
End Sub
Public Sub SendData(ByVal RequestID As Integer, ByVal Data As
String)
Try
Dim sckSocket As Client = CType(ClientTable.Item
(RequestID), Client)
sckSocket.SendData(Data)
Catch ex As Exception
' TODO: Error Handling
End Try
End Sub
Public Sub Broadcast(ByVal Data As String)
Dim objClient As Client
Dim key As Integer
Try
For Each key In ClientTable.Keys
objClient = CType(ClientTable.Item(key), Client)
objClient.SendData(Data)
Next
Catch ex As Exception
' TODO: Error Handling
End Try
End Sub
Public Sub Dispose()
Dim key As Integer
Try
For Each key In ClientTable.Keys
Dim sckSocket As Client = CType(ClientTable.Item
(key), Client)
sckSocket.CloseSocket()
Next
Catch ex As Exception
' TODO: Error Handling
End Try
End Sub
End Class
Public Class Client
Private trdClient As Thread
Private sckClient As Socket
Private readBuffer(32767) As Byte
Public Event DataArrival As DataArrivalDelegate
Public Event ClientDisconnected As DisconnectedDelegate
Public Sub New(ByVal sckSocket As Socket)
sckClient = sckSocket
sckClient.BeginReceive(readBuffer, 0, 32767,
SocketFlags.None, AddressOf DataArrivalThread, Nothing)
End Sub
Public Sub SendData(ByVal Data As String)
Dim byteData() As Byte
byteData = System.Text.ASCIIEncoding.ASCII.GetBytes(Data)
SyncLock sckClient
sckClient.Send(byteData)
End SyncLock
End Sub
Private Sub DataArrivalThread(ByVal ar As IAsyncResult)
Dim intReadBytes As Integer
Dim strData As String
Try
Do While True
SyncLock sckClient
' Stop async read to get the data
intReadBytes = sckClient.EndReceive(ar)
End SyncLock
sckClient.Receive(readBuffer, 0, sckClient.Available,
SocketFlags.None)
strData = Encoding.ASCII.GetString(readBuffer, 0,
intReadBytes - 1)
RaiseEvent DataArrival(CType
(sckClient.Handle.ToInt32, Integer), strData)
SyncLock sckClient
' Restart async read
sckClient.BeginReceive(readBuffer, 0, 32767,
SocketFlags.None, AddressOf DataArrivalThread, Nothing)
End SyncLock
Loop
Catch ex As Exception
' TODO: Error Handling
CloseSocket()
End Try
End Sub
Public Sub CloseSocket()
RaiseEvent ClientDisconnected(CType(sckClient.Handle.ToInt32,
Integer))
sckClient.Shutdown(SocketShutdown.Both)
sckClient.Close()
End Sub
End Class
End Namespace