|
[ 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
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|