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
[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
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)
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);