Oppure

Loading
10/02/13 12:44
MirkoDistefano
Salve a tutti,

in questo periodo mi sto dedicando ai socket. Sto cercando di costruire un programmino (in VB.NET 2010) che manda messaggi da client a server e viceversa. Mi sono bloccato in un punto.

Dovrei mandare una scritta variabile tramite il NetworkStream dalla textbox1 del client alla textbox1 del server, e un'altra scritta (sempre variabile) dalla textbox2 del client alla textbox2 del server. Il problema è io mando da textbox1 e 2 però arrivano tutte e 2 nella textbox1 del server e non si dividono.

Mi servirebbe un codice che direbbe se la scritta ti arriva dalla textbox1 del client mettila nella textbox1 del server.
Vi prego aiutatemi voi, perchè mi sono già bloccati da giorni nel mio progetto.

Grazie in anticipo :)

aaa
10/02/13 13:22
Qwertj
implementa una specie di protocollo
aggiungi alla stringa un carattere all'inizio che indica la textbox, poi lo togli prima di mostrarlo

ho capito il tuo problema?
aaa
12/02/13 13:08
MirkoDistefano
Ti Posto il codice cosi si capisce meglio il problema :)

I programmi funzionano che il Client all'avvio si connette in automatico al server in locale.
Il server all'avvio in automatico accetta.
Quando il server è connesso la prima cosa che fa è attivare il timer per la lettura della chat e un altro timer che sarebbe quello per mandare le informazioni del computer al client.
Il client quando è connesso anche lui attiva il timer per la lettura della chat e un altro timer che sarebbe quello per ricevere le informazioni del computer server per poi smistarle nelle determinate TextBox
esempio.

Nome Computer nella textbox1

Sistema Operativo nella textbox2

CODICE CLIENT

Imports System.Net.Sockets
Imports System.Text.UTF8Encoding

Public Class Form1
Dim Client As TcpClient
Dim Flusso As NetworkStream

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Start()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Client = New TcpClient
Try
Client.Connect("127.0.0.1", 8888)
Catch SE As SocketException
Timer1.Stop()
Timer1.Start()
End Try
If Client.Connected Then
Timer1.Stop()
TextBox2.Text = TextBox2.Text & "Connessione OK" & vbCrLf
Flusso = Client.GetStream()
Timer2.Start()
Timer3.Start()
Else
TextBox2.Text = TextBox2.Text & "Connessione fallita" & vbCrLf
Timer1.Stop()
Timer1.Start()
End If
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 Temporaneo(Client.Available - 1) As Byte
Flusso.Read(Temporaneo, 0, Temporaneo.Length)
Dim Testo As String = UTF8.GetString(Temporaneo)
TextBox2.Text = TextBox2.Text & Testo & vbCrLf
End If
End Sub

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
If Client.Available > 0 Then
Dim Temporaneo1(Client.Available - 1) As Byte
Flusso.Read(Temporaneo1, 0, Temporaneo1.Length)
Dim Testo1 As String = UTF8.GetString(Temporaneo1)
TextBox4.Text = TextBox4.Text & Testo1 & vbCrLf
End If
If Client.Available > 0 Then
Dim Temporaneo2(Client.Available - 1) As Byte
Flusso.Read(Temporaneo2, 0, Temporaneo2.Length)
Dim Testo2 As String = UTF8.GetString(Temporaneo2)
TextBox5.Text = TextBox5.Text & Testo2 & vbCrLf
End If
Timer3.Stop()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Temporaneo() As Byte = UTF8.GetBytes(TextBox1.Text)
Flusso.Write(Temporaneo, 0, Temporaneo.Length)
TextBox1.Text = ""
End Sub
End Class

------------------------------CODICE SERVER------------------

Imports System.Net.Sockets
Imports System.Text.UTF8Encoding

Public Class Form1
Dim Listener As TcpListener
Dim Client As TcpClient
Dim Flusso As NetworkStream

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Listener = New TcpListener(8888)
Listener.Start()
Timer1.Start()
TextBox2.Text = TextBox2.Text & "Sono in attesa di qualcuno..." & vbCrLf
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Listener.Pending() Then
Timer1.Stop()
Client = Listener.AcceptTcpClient()
Listener.Stop()
Flusso = Client.GetStream()
Timer2.Start()
Timer3.Start()
TextBox2.Text = TextBox2.Text & "Si è connesso un utente" & vbCrLf
End If
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 Temporaneo(Client.Available - 1) As Byte
Flusso.Read(Temporaneo, 0, Temporaneo.Length)
Dim Testo As String = UTF8.GetString(Temporaneo)
TextBox2.Text = TextBox2.Text & Testo & vbCrLf
End If
End Sub

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
Dim Temporaneo1() As Byte = UTF8.GetBytes("IP Locale";)
Flusso.Write(Temporaneo1, 0, Temporaneo1.Length)
Dim Temporaneo2() As Byte = UTF8.GetBytes("Nome Computer";)
Flusso.Write(Temporaneo2, 0, Temporaneo2.Length)
Timer3.Stop()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Temporaneo() As Byte = UTF8.GetBytes(TextBox1.Text)
Flusso.Write(Temporaneo, 0, Temporaneo.Length)
TextBox1.Text = ""
End Sub
End Class


------

Il problema sta che quando il server invia le informazioni, il client le riceve però le legge entrambe nella textbox per la chat senza spazi.


Grazie moltissimo per l'aiuto che mi state dando :)

aaa
12/02/13 16:41
Qwertj
ma nel tuo codice come fai a distinguere se i dati inviati sono per la textbox1 o la textbox2?
aaa
12/02/13 20:18
MirkoDistefano
Io penso con il timer3 che ce nel Client

Cioè un informazione che parte dal server va alla textbox4 e l'altra informazione che parte dal server va nella textbox5...solo che il client prende tutto quello che arriva come fosse una parola che invio con la chat...sapete come potrei risolvere il problema? :)

aaa
13/02/13 13:12
MirkoDistefano
P.S.

Ho provato a modificare il codice del client e a mettere nel timer --- se il testo che arriva "contains" la parola IP Locale deve essere inserito nella TextBox4 se invece il testo che arriva "contains" la parola Nome Computer deve essere inserito nella TextBox5

Solo che quando arriva mi arriva tutto nella TextBox4 così "IP LocaleNome Computer"
aaa
14/02/13 18:46
Qwertj
perchè usi millemila timer? e ripeto, con cosa dovresti distinguere i messaggi per una textbox da quelli per l'altra?
commenta il codice, please :yup:
aaa
15/02/13 9:44
MirkoDistefano
Non ne ho idea, vi prego ditemelo voi, sono troppo confuso ormai.

Che timer potrei eliminare?

aaa