Ciao a tutti sto studiando un po le socket con vb.net e ho creato un semplice programma client-server che colloquiano con una chat.. ora vorrei aggiungere la cam (video chat) quindi dovrei inviare il flusso dati della cam da client a server e viceversa.... come devo splittare il flusso dati? avevo pensato ad una cosa tipo...
client:
dim msg as string = "CHAT"
dim separatore as string = msg.split("|")
send (separatore, Stream)
server:
select case opt(0)
case "CHAT|"
operazioni.....
case "CAM|"
end select
vi posto il codice client server....
CLIENT:
codice:
Imports System.Net.Sockets
Imports System.Text.UTF8Encoding
Imports System.IO
Imports System.Runtime.InteropServices
Public Class frmMain
'Webcam
Public Touchless As New TouchlessLib.TouchlessMgr
Public Camera1 As TouchlessLib.Camera = Touchless.Cameras.ElementAt(0)
Dim IP As System.Net.IPHostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName)
Dim client As TcpClient
Dim Stream As NetworkStream
Private Sub Client_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If System.IO.File.Exists(Application.StartupPath & "\" & "WebCamLib.dll") = False Then
Dim B() As Byte
Dim RM As Resources.ResourceManager
RM = New Resources.ResourceManager("vbClient.Resources", System.Reflection.Assembly.GetExecutingAssembly)
B = RM.GetObject("WebCamLib")
System.IO.File.WriteAllBytes(Application.StartupPath & "\" & "WebCamLib.dll", B)
End If
Nickname.Text = My.User.Name
TextBox2.Text = "Conversazione" & vbCrLf
TextBox2.ReadOnly = True
' lblIP.Text = IP.AddressList.GetValue(0).ToString
' WebCam.StartFeed(Me.PictureBox1.Handle.ToInt32)
Try
Touchless.CurrentCamera = Camera1
Touchless.CurrentCamera.CaptureHeight = 240
Touchless.CurrentCamera.CaptureWidth = 320
Timer2.Start()
Call connect()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Public Sub connect()
Dim Address As Net.IPAddress
Net.IPAddress.TryParse(Me.txtip.Text, Address)
client = New TcpClient
client.Connect(Address, Me.txtport.Text)
If client.Connected Then
Stream = client.GetStream
Me.Timer1.Start()
Me.TextBox2.Text = Me.TextBox2.Text & "Connessione effettuata." & vbCrLf
Stream.Write(UTF8.GetBytes("Si è connesso " & Me.Nickname.Text & "!"), 0, UTF8.GetBytes("Si è connesso " & Me.Nickname.Text & "!").Length)
Else
Me.TextBox2.Text = Me.TextBox2.Text & "Impossibile connettersi..." & vbCrLf
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If client.Available > 0 Then
Dim x(client.Available - 1) As Byte
Stream.Read(x, 0, x.Length)
Dim text As String = UTF8.GetString(x)
TextBox2.Text = TextBox2.Text & text & vbCrLf
' Dim msg As String = "CAM|"
' Dim ss() As Byte = BmpToByte(pView.Image)
' Stream.Write(ss, 0, ss.Length)
End If
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
TextBox2.Text = "Conversazione" & vbCrLf
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim y() As Byte = UTF8.GetBytes(Nickname.Text & ": " & TextBox1.Text)
Stream.Write(y, 0, y.Length)
TextBox2.Text = TextBox2.Text & Nickname.Text & ": " & TextBox1.Text & vbCrLf
TextBox1.Text = Nothing
Catch ex As NullReferenceException
MsgBox("Non sei collegato con nessuno!")
Catch ex As System.IO.IOException
MsgBox("Il destinatario si è scollegato o ha conflitti di IP!")
End Try
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
pView.Image = Touchless.CurrentCamera.GetCurrentImage
End Sub
'Funzione di conversione da BMP a Byte
Public Shared Function BmpToByte(ByVal _bitmap As System.Drawing.Bitmap) As Byte()
Dim _ms As New Global.System.IO.MemoryStream()
_bitmap.Save(_ms, System.Drawing.Imaging.ImageFormat.Bmp)
Dim _bmpArray As Byte()
_bmpArray = _ms.ToArray()
_ms.Flush()
_ms.Dispose()
Return _bmpArray
End Function
End Class
SERVER:
codice:
Imports System.Net.Sockets
Imports System.Text.UTF8Encoding
Public Class frmMain
Dim Listener As TcpListener
Dim Client As TcpClient
Dim Stream As NetworkStream
Private Sub Server_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Nickname.Text = "kerberos5"
Chat.Text = "Conversazione" & vbCrLf
Chat.ReadOnly = True
Listener = New TcpListener(8080)
Listener.Start()
Timer1.Start()
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
If Client.Available > 0 Then
Dim x(Client.Available - 1) As Byte
Stream.Read(x, 0, x.Length)
Dim text As String = UTF8.GetString(x)
Chat.Text = Chat.Text & text & vbCrLf
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Listener.Pending = True Then
Timer1.Stop()
Client = Listener.AcceptTcpClient()
Listener.Stop()
Stream = Client.GetStream()
Timer2.Start()
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim y() As Byte = UTF8.GetBytes(Nickname.Text & ": " & Messaggio.Text)
Stream.Write(y, 0, y.Length)
Chat.Text = Chat.Text & Nickname.Text & ": " & Messaggio.Text & vbCrLf
Messaggio.Text = Nothing
Catch ex As NullReferenceException
MsgBox("Non si è ancora connesso nessuno, aspetta e riprova!")
Catch ex2 As System.IO.IOException
MsgBox("Il destinatario del messaggio si è scollegato o ha conflitti di IP!")
End Try
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Chat.Text = "Conversazione" & vbCrLf
End Sub
'Funzione di conversione da Byte a BMP
Public Shared Function ByteToBmp(ByVal _imgByteArray As Byte()) As System.Drawing.Bitmap
Dim _ms As New Global.System.IO.MemoryStream(_imgByteArray, 0, _imgByteArray.Length)
_ms.Write(_imgByteArray, 0, _imgByteArray.Length)
Dim _bmp As New System.Drawing.Bitmap(_ms)
_ms.Flush()
_ms.Dispose()
Return _bmp
End Function
End Class