Senden und Enfangen mit Socket Server und Client

Moin, Ich Schreibe mit VB einen Server und einen Client nur Funktioniert das Senden und Entfangen nicht !
Entfangen Alleine ist kein Problem Aber wenn ich was an den Client Zurück senden möchte dann geht das nicht

Server

 Sub Main()
        Console.WriteLine("Bitte Geben Sie einen Port ein")
        Dim port As Integer = Console.ReadLine()

        Dim socket As New Net.Sockets.TcpListener(port)
        Dim client As Net.Sockets.TcpClient
        socket.Start()
        Console.WriteLine(Today & " " & TimeOfDay & " // " & "Server Gestartet")
        While (True)
            Try
                client = socket.AcceptTcpClient
                Dim reader As New IO.StreamReader(client.GetStream)
                Dim writer As New IO.StreamWriter(client.GetStream)

                Using reader
                    Console.WriteLine(Today & " " & TimeOfDay & " // " & reader.ReadToEnd)
                End Using
                Using writer
                    writer.WriteLine("hallo")
                End Using


                client.Close()

            Catch ex As Exception
                Console.WriteLine(Today & " " & TimeOfDay & " #FEHLER // " & ex.Message)
            End Try

        End While

    End Sub

Client

Sub Main()
1:
        Try
            Console.WriteLine("Geben Sie eine Nachricht ein")
            Dim Client As New Net.Sockets.TcpClient("127.0.0.1", 1234)
            Dim writer As New IO.StreamWriter(Client.GetStream)
            Dim reader As New IO.StreamReader(Client.GetStream)
            writer.WriteLine(Console.ReadLine())
            Console.WriteLine(reader.ReadLine)
            writer.Close()
            reader.Close()
        Catch ex As Exception
            Console.WriteLine(Today & " " & TimeOfDay & " #FEHLER// " & ex.Message)
        End Try
        GoTo 1





    End Sub

Grüße Andy

was heißt geht nicht?

Oh wir haben ja gar kein Highlight für VB drin

Wenn ich bei dem Client was los sende, kommt nichts am Server an. Sobald ich den Client Beende Kommt ein Fehler.

Gruß Andy

Moin,

[EVIL]!BÄH![/EVIL]

1:
...
Goto 1

[EVIL]und nochmal !BÄH![/EVIL]
ersetzt das mal bitte durch


while true
...
done

ich weis jetzt nicht ob das richtiger VB-Code war - ist lange her. Jedenfalls, mach da mal bitte eine Endlosschleifen draus. GOTO führt zu definitiv nicht mehr wartbarem Code und ist ein Relikt aus den 90er

ansonsten


Console.WriteLine(Today & " " & TimeOfDay & " // " & reader.ReadToEnd)

wartest Du hier am Server bis der Client-Stream geschlossen ist. Den schließt Du aber erst nach dem Server was gesendet hat. Typischer Fall von “Deadlock”.

Wenn Du etwas mit TCP versenden willst, dann versende als erstes wieviel Bytes Dein Paket hat und lies genau die Menge am anderen Ende wieder ein. Stell Dir vor ein TCP-Stream ist wie ein Wasserhahn. Um ein Liter Wasser zu messen brauchst Du auch ein leeres Gefäß als Anfang und eine Markierung mit 1l. Wobei letzteres halt die Anzahl der Zeichen sind (z.B. 1kB)

hand, mogel

Verstehe ich nicht, meinst du ich soll die Strings in Bytes Umwandeln und Zuerst die Größe der Bytes Senden.
??

Gruß Andy

ja - es werde eh nur Bytes gesendet. Mit WriteLine() wird das nur vor Dir versteckt. Es ist zwar etwas mehr Tipparbeit, aber am Ende verstehst Du mehr was Du da machst.

Wenn Du irgendwie vor hast mehr mit Sockets zu machen, dann bastle Dir Deine eigene kleine Library dazu. Bei mir sieht das an der Stelle so aus (C# bzw. Java):

Client (unabgespeckt, nur senden):


NetClient client = new NetClient("192.168.1.1", 1234);
client.sendPacket(new NetPacket("hallo welt"));

Server (abgespeckt um die ganzen Listener)


NetServer server = new NetServer(1234);
server.addListener(this);

irgendwo durch Listener aufgerufen


	public void NetClientDataReceived(NetClient sender, NetClientDataReceivedEvent e) {
		NetPacket packet = e.getNetPacket();
		String command = packet.getDataString();
		Logging.info(">>> " + command);
	}