sockets

Iniciado por flashnet, 16 Marzo 2010, 01:10 AM

0 Miembros y 2 Visitantes están viendo este tema.

flashnet

Hola buenas, tengo un pequeño problema.
Quiero hacer un cliente al cual conecte a distintos servers simultaneamente y el comando que envie se envie a todos.
Hasta hay bien, el problema esta en que no consigo hacer varias conexiones a la ver solo una.
A ver si me podeis ayudar.

Gracias de antemano

aqui el codigo



Imports System.IO
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading


Public Class Form1

    Private oTCPStream As Net.Sockets.NetworkStream
    Public Shared oTCP As New Net.Sockets.TcpClient()
    Private bytWriting As [Byte]()
    Private bytReading As Byte()

    Private oHebras As Thread


    Public Delegate Sub ParameterizedThreadStart(ByVal obj As String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        txtNameFile.ReadOnly = True
        OpenFileDialog1.Filter = "File Txt |*.txt"
        OpenFileDialog1.Title = "Open File"
        OpenFileDialog1.Multiselect = False

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnArchivo.Click

        ComboBox1.Items.Clear()

        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            txtNameFile.Text = OpenFileDialog1.FileName

        End If
        If Not Trim(txtNameFile.Text) = "" Then
            Dim objReader As New StreamReader(txtNameFile.Text)
            Dim sLine As String = ""

            While sLine IsNot Nothing
                sLine = objReader.ReadLine()
                If sLine IsNot Nothing Then
                    ComboBox1.Items.Add(sLine)
                End If
            End While

            objReader.Close()

        End If

    End Sub

    Private Function ConnServ(ByRef VarIP) As Object

        If Not VarIP = "" Then
            Try
                System.Threading.Thread.Sleep(1500)

                oTCP.SendTimeout = 1500
                oTCP.Connect(Trim(VarIP), "8000")

                oTCPStream = oTCP.GetStream

                WriteData(Trim(txtUser.Text) & vbCrLf)
                System.Threading.Thread.Sleep(500)

                WriteData(Trim(txtPassword.Text) & vbCrLf)
                System.Threading.Thread.Sleep(500)

                WriteData("Hello Serv" & vbCrLf)
                System.Threading.Thread.Sleep(500)

                '  oTCPStream.Close()
                '  oTCP.Close()

            Catch ex As Exception
                MsgBox(ex.Message)

            End Try

        End If

        Return Nothing

    End Function

    Private Sub WriteData(ByVal sData As String)

        bytWriting = System.Text.Encoding.ASCII.GetBytes(sData)

        oTCPStream.Write(bytWriting, 0, bytWriting.Length)

    End Sub


    Private Sub btnConn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConn.Click

        Dim I As Integer
        Dim NewIP As String


        For I = 0 To ComboBox1.Items.Count - 1
            NewIP = (ComboBox1.Items(I).ToString)

            Dim t As New Thread(DirectCast(Function() ConnServ(NewIP), ThreadStart))
            t.Start()


        Next
    End Sub
End Class


raul338

No se puede conectar un socket cliente a varios servidores. Debes hacerte un array de sockets (o tcpClients) que conecten uno a cada servidor. Luego para mandarle los datos. Recorres ese arreglo enviando uno por uno

[D4N93R]

Exacto, un socket por conexión, jjejej Raul deja el empeño con los sockets, FlashNet usa TcpClient :P es lo mismo pero más arreglado.. :D

Claro, amenos de que desees controlar mejor la conexión, pero no creo que sea tu caso.

Un saludo!

raul338

Soy socket-Fan! JAJA.... es que desde que aprendi sockets (en vb6) lo uso de esa manera y me parece mas "comoda"

[D4N93R]

:P A mi también me gusta hacer las cosas así. xD es mas divertido. mas crudo :D

flashnet

Me podias poner un ejemplo simple de conexion multiple con TcpClient?
y como se realizaria con un array?

Muchas gracias a los 2 por la ayuda

Cita de: D4N93R en 16 Marzo 2010, 14:23 PM
Exacto, un socket por conexión, jjejej Raul deja el empeño con los sockets, FlashNet usa TcpClient :P es lo mismo pero más arreglado.. :D

Claro, amenos de que desees controlar mejor la conexión, pero no creo que sea tu caso.

Un saludo!

[D4N93R]

Uhm, ahora no estoy en el equipo con VS y no puedo probar :( Alquien me puede ayudar aki , raul! jaja

raul338

acabo de reformatear y tampoco tengo el vs, asi que pondre algo de C# con pseudo codigo JAJA XD

Código (csharp) [Seleccionar]

using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Net;

namespace MuestraClienteMultiple{
class program {

struct Conexion {
   byte[] buffer;
   TcpClient client;
   string host;
}

static int main() {
string[] hosts = { "google.com", "www.raul338.com.ar" }; // direcciones servidor
List<Conexion> conexiones = new List<Conexion>(hosts.Length); // Lista del mismo tamaño de las direcciones

foreach (string s in hosts) {
   Conexion conex;
   conex.host = s;
   conex.buffer = new Byte[2048]; // 2 Mb de buffer
   conex.client = new TcpClient(); // Direccion en el puerto 80
   conexiones.Add(conex);
   
   conex.client Connect(s, 80);
   if (conex.client.Connected) {
      StreamReader sr = new StreamReader(conex.client.GetStream());
      Console.WriteLine(sr.ReadToEnd());
   }
   conex.Close();
} // foreach

}
}// class program
}// namespace


Deberia funcionar, .... es un ejemplo basico inventado al vuelo. Te devuelve las salidas HTML de google y de mi pagina web :P

flashnet

Muchisimas gracias a los 2, le voy a echar un vistazo.

Se agradece vuestro interes

:-)

[D4N93R]

Excelente, Y eso que esta echo a lo rápido, pero quedo muy bien, voy a modificarlo con tu permiso.

Código (csharp) [Seleccionar]
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Net;

namespace MuestraClienteMultiple{
class program {

public class Conexion {
   byte[] buffer;
   TcpClient client;
   string host;
   
   public Conexion(string hostname, int bufferSize){
       host =hostname;
       buffer = new Byte[bufferSize];
   }
   
   public string GetData(){
       string result=String.Empty;
       try{
          client Connect(s, 80);
     
          if (client.Connected) {
              StreamReader sr = new StreamReader(client.GetStream());
              result= sr.ReadToEnd());
          }
       }
       finally{
          conex.Close();
       }
       return result;
   }
}

static int main() {
string[] hosts = { "google.com", "www.raul338.com.ar" }; // direcciones servidor
List<Conexion> conexiones = new List<Conexion>(hosts.Length); // Lista del mismo tamaño de las direcciones

foreach (string s in hosts) {
   Conexion conex = new Conexion(x, 2048);
   //conex.buffer = new Byte[2048]; // 2 Mb de buffer
   //conex.client = new TcpClient(); // Direccion en el puerto 80
   conexiones.Add(conex);

   Console.WriteLine(conex.GetData());
   
} // foreach

}
}// class program
}// namespace