[ Black One @ 02.03.2010. 08:57 ] @
Pozdrav svima.

Dali bi mi netko mogao dati jednostavni primjer il link do tutoriala kako u vb.netu napravit program client, server i da funkcioniraju zajedno.

Prije sam u vb 6 radio s WinSock komandom i bio sam jako zadovoljan snjom jer vrlo jednostavno bilo raditi snjom.
Čitao sam da je dosta lakše radit u vb.net s socketima al koliko sam gledo na netu meni baš i nije lakše pa ako netko ima dobar primjerak da je sve objašnjeno kako rade socketi molio bi ga da mi pomogne.

Radio bi jedan chat program za svoju lokalnu mrežu.
[ zika025 @ 07.05.2010. 11:54 ] @
Ako te jos zanima materijal na tu temu, imam primer jednostavne client - server aplikacije, bas za chat, pa odatle mozes da vidis kako sve funkcionise i da stvoris neku osnovu.
Sve u svemu, ako si zainteresovan, javi se, pa da ti posaljem na mejl.
[ Black One @ 08.05.2010. 08:49 ] @
poslana pp ;)
[ pl4stik @ 10.05.2010. 07:08 ] @
Jel' moze i za nas s jeftinijim ulaznicama
[ zika025 @ 15.05.2010. 19:13 ] @
Evo, nasao sam malo vremena, pa sam malo sredio kod tog programcica sto sam nasao, i napravio klasu od njega. Doduse, ovo je samo client strana. Server ce doci uskoro, kad opet nakrpim malo vremena.
Mislim da se moze skontati sta, kako i zasto radi, a mozete i kopirati klasu, pa pozivati metode.

Evo koda:

Code (vbnet):

Imports System.Net.Sockets

Public Class TcpClient

    Public Event MessageRecieved(ByVal Message As String)
    Public Event ErrorOccured(ByVal ErrorNumber As Integer, ByVal ErrorCaller As String, ByVal Reason As String)

    Dim ClientSocket As New System.Net.Sockets.TcpClient
    Dim ServerStream As NetworkStream
    Dim Receiving As Threading.Thread = New Threading.Thread(AddressOf GetMessage)

    Dim strMessage As String
    Dim blnIsConnected As Boolean = False

    Public ReadOnly Property LastMessage() As String
        Get
            Return strMessage
        End Get
    End Property
    Public ReadOnly Property IsConnected() As Boolean
        Get
            Return blnIsConnected
        End Get
    End Property

    Public Sub ConnectToServer(ByVal ServersIP As String, ByVal Port As Integer, Optional ByVal StartReceivingNow As Boolean = False)

        Try
            ClientSocket.Connect(ServersIP, Port)
            ServerStream = ClientSocket.GetStream
            If StartReceivingNow Then
                Call StartReceiving()
            End If
            blnIsConnected = True
        Catch ex As Exception
            RaiseEvent ErrorOccured(1, "Public Sub ConnectToServer", ex.Message.ToString)
        End Try

    End Sub

    Public Sub CloseConnection()

        If blnIsConnected Then
            ServerStream.Close()
            ClientSocket.Close()
            blnIsConnected = False
            If Receiving.IsAlive Then
                Receiving.Abort()
            End If
        Else
            RaiseEvent ErrorOccured(3, "Public Sub CloseConnection", "Not connected.")
        End If

    End Sub

    Public Sub StartReceiving()

        If blnIsConnected Then
            Receiving.Start()
        Else
            RaiseEvent ErrorOccured(3, "Public Sub StartReceiving", "Not connected.")
        End If

    End Sub

    Public Sub SendMessage(ByVal Message As String)

        If blnIsConnected Then
            Dim TextToSend As Byte()

            TextToSend = System.Text.Encoding.ASCII.GetBytes(Message)
            ServerStream.Write(TextToSend, 0, TextToSend.Length)
            ServerStream.Flush()
        Else
            RaiseEvent ErrorOccured(3, "Public Sub SendMessage", "Not connected.")
        End If

    End Sub

    Private Sub GetMessage()

        Do
            Try
                ServerStream = ClientSocket.GetStream

                Dim BufferSize As Integer
                Dim Buffer(10024) As Byte

                BufferSize = ClientSocket.ReceiveBufferSize
                ServerStream.Read(Buffer, 0, BufferSize)
                strMessage = System.Text.Encoding.ASCII.GetString(Buffer)

                RaiseEvent MessageRecieved(strMessage)
            Catch ex As Exception
                If blnIsConnected Then
                    RaiseEvent ErrorOccured(2, "Private Sub GetMessage", ex.Message.ToString)
                    Call CloseConnection()
                End If
            End Try
        Loop While blnIsConnected

    End Sub

End Class
 


U okviru forme bi trebali ubaciti nesto ovako...
Code (vbnet):

    Dim WithEvents Client As New TcpClient
    Dim strMessage As String

    Private Sub NewMessage(ByVal RecievedMessage As String) Handles Client.MessageRecieved

        strMessage = RecievedMessage
        If Me.InvokeRequired Then
            Me.Invoke(New MethodInvoker(AddressOf ShowMessage))
        Else
            ShowMessage()
        End If

    End Sub

    Private Sub ShowMessage()

        TextBox2.Text = TextBox2.Text + vbCrLf + strMessage

    End Sub
 


Ovo je neophodno zbog thread-a koji prima poruke.

Nadam se da ce vam biti od koristi. Ako imate nekih pitanja, primedbi, sugestija, ili ideju kako resiti ovo s thread-om i invoke, tj. kako ih ugraditi u klasu, rad sam da cujem. ;)

[Ovu poruku je menjao mmix dana 24.05.2010. u 08:59 GMT+1]
[ Boris B. @ 17.05.2010. 10:38 ] @
U principu to je to, samo na jednu stvar treba promeniti. Ili napravi klasu koja vraca u OnMessageRecieved vraca byte[] umesto stringa i pusti petljanje sa protokolom aplikaciji koja koristi klasu, ili napravi kolektor pomocnu klasu koja ce tek kad primi CrLf (ili neki tvoj control sequence) okinuti event OnMesageRecieved(string), zato sto ti niko ne garantuje da ce ServerStream.Read vratiti uvek tacno jedan red, a resultat Read metode ti kaze koliko je zaista bajtova uspeo da procita.


[Ovu poruku je menjao Boris B. dana 17.05.2010. u 11:51 GMT+1]
[ zika025 @ 24.05.2010. 05:37 ] @
Evo konacno i server strane chat aplikacije.
Na zalost, nisam imao vremena da je sredim, pa postavljam kod takav kakvog sam ga nasao...

Code (vbnet):

Imports System.Net.Sockets
Imports System.Text

Module Module1

    Dim clientsList As New Hashtable

    Sub Main()

        Dim serverSocket As New TcpListener(8888)
        Dim clientSocket As TcpClient
        Dim infiniteCounter As Integer
        Dim counter As Integer

        serverSocket.Start()
        msg("Chat Server Started ....")
        counter = 0
        infiniteCounter = 0
        For infiniteCounter = 1 To 2
            infiniteCounter = 1
            counter += 1
            clientSocket = serverSocket.AcceptTcpClient()

            Dim bytesFrom(10024) As Byte
            Dim dataFromClient As String

            Dim networkStream As NetworkStream = _
            clientSocket.GetStream()
            networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
            dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
            dataFromClient = _
            dataFromClient.Substring(0, dataFromClient.IndexOf("$"))

            clientsList(dataFromClient) = clientSocket

            broadcast(dataFromClient + " Joined ", dataFromClient, False)

            msg(dataFromClient + " Joined chat room ")
            Dim client As New handleClinet
            client.startClient(clientSocket, dataFromClient, clientsList)
        Next

        clientSocket.Close()
        serverSocket.Stop()
        msg("exit")
        Console.ReadLine()

    End Sub

    Sub msg(ByVal mesg As String)
        mesg.Trim()
        Console.WriteLine(" >> " + mesg)
    End Sub

    Private Sub broadcast(ByVal msg As String, ByVal uName As String, ByVal flag As Boolean)

        Dim Item As DictionaryEntry

        For Each Item In clientsList
            Dim broadcastSocket As TcpClient

            broadcastSocket = CType(Item.Value, TcpClient)

            Dim broadcastStream As NetworkStream = broadcastSocket.GetStream()
            Dim broadcastBytes As [Byte]()

            If flag = True Then
                broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg)
            Else
                broadcastBytes = Encoding.ASCII.GetBytes(msg)
            End If

            broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length)
            broadcastStream.Flush()
        Next

    End Sub

    Public Class handleClinet

        Dim clientSocket As TcpClient
        Dim clNo As String
        Dim clientsList As Hashtable

        Public Sub startClient(ByVal inClientSocket As TcpClient, ByVal clineNo As String, ByVal cList As Hashtable)

            Me.clientSocket = inClientSocket
            Me.clNo = clineNo
            Me.clientsList = cList
            Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat)
            ctThread.Start()

        End Sub

        Private Sub doChat()

            Dim infiniteCounter As Integer
            Dim requestCount As Integer
            Dim bytesFrom(10024) As Byte
            Dim dataFromClient As String
            Dim sendBytes As [Byte]()
            Dim serverResponse As String
            Dim rCount As String

            requestCount = 0
            For infiniteCounter = 1 To 2
                infiniteCounter = 1
                Try
                    requestCount = requestCount + 1

                    Dim networkStream As NetworkStream = clientSocket.GetStream()

                    networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
                    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"))
                    msg("From client - " + clNo + " : " + dataFromClient)
                    rCount = Convert.ToString(requestCount)

                    broadcast(dataFromClient, clNo, True)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try
            Next

        End Sub

    End Class

End Module
 


Pozdrav!

[Ovu poruku je menjao mmix dana 24.05.2010. u 08:52 GMT+1]
[ mmix @ 24.05.2010. 07:51 ] @
Code (vbnet):
        infiniteCounter = 0
        For infiniteCounter = 1 To 2
            infiniteCounter = 1
...
        Next


Zezas se ili stvarno ne znas kako da napravis mrtvu petlju?
[ zika025 @ 24.05.2010. 13:31 ] @
Znam, ali to nije moj kod. Kako sam ga nasao, tako sam ga postavio. Hteo sam ga srediti, ali jednostavno nisam imao vremena, pa sam ga okacio takvog kakav je. ;)
[ Black One @ 24.05.2010. 14:03 ] @
postavim i ja za dan svoj kod što sam ga sredio al imam jedan problem korisnici se uspiju spojit na server ali kad pošalju poruku prime samo nazad svoju poruku al ne i od drugih korisnika tak isto i za ostale tko god se spoji kad uhvatim vremena objavim kod