![]()
|
|
Visual Basic Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
Imports System.Net.Sockets Imports System.IO Imports System.Net ' TCP-MultiServer ' C 2009 - Vincent Casser Module Module1 Private server As TcpListener Private client As New TcpClient Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 8000) ' eingestellt ist port 8000. dieser muss ggf. freigegeben sein! Private list As New List(Of Connection) Private Structure Connection Dim stream As NetworkStream Dim streamw As StreamWriter Dim streamr As StreamReader Dim nick As String ' natürlich optional, aber für die identifikation des clients empfehlenswert. End Structure Private Sub SendToAllClients(ByVal s As String) For Each c As Connection In list ' an alle clients weitersenden. Try c.streamw.WriteLine(s) c.streamw.Flush() Catch End Try Next End Sub Sub Main() Console.WriteLine("Der Server läuft!") server = New TcpListener(ipendpoint) server.Start() While True ' wir warten auf eine neue verbindung... client = server.AcceptTcpClient Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection... c.stream = client.GetStream c.streamr = New StreamReader(c.stream) c.streamw = New StreamWriter(c.stream) c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen. list.Add(c) ' und fügen sie der liste der clients hinzu. Console.WriteLine(c.nick & " has joined.") ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients Dim t As New Threading.Thread(AddressOf ListenToConnection) t.Start(c) End While End Sub Private Sub ListenToConnection(ByVal con As Connection) Do Try Dim tmp As String = con.streamr.ReadLine ' warten, bis etwas empfangen wird... Console.WriteLine(con.nick & ": " & tmp) SendToAllClients(con.nick & ": " & tmp) ' an alle clients weitersenden. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet. list.Remove(con) Console.WriteLine(con.nick & " has exit.") Exit Do End Try Loop End Sub End Module |
|
|
Visual Basic Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
Imports System.Net.Sockets Imports System.IO Public Class Form1 Private stream As NetworkStream Private streamw As StreamWriter Private streamr As StreamReader Private client As New TcpClient Private t As New Threading.Thread(AddressOf Listen) Private Delegate Sub DAddItem(ByVal s As String) Private nick As String = "unknown" Private Sub AddItem(ByVal s As String) ListBox1.Items.Add(s) End Sub Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown Try client.Connect("127.0.0.1", 8000) ' hier die ip des servers eintragen. ' da dieser beim testen wohl lokal läuft, hier die loopback-ip 127.0.0.1. If client.Connected Then stream = client.GetStream streamw = New StreamWriter(stream) streamr = New StreamReader(stream) streamw.WriteLine(nick) ' das ist optional. streamw.Flush() t.Start() Else MessageBox.Show("Verbindung zum Server nicht möglich!") Application.Exit() End If Catch ex As Exception MessageBox.Show("Verbindung zum Server nicht möglich!") Application.Exit() End Try End Sub Private Sub Listen() While client.Connected Try Me.Invoke(New DAddItem(AddressOf AddItem), streamr.ReadLine) Catch MessageBox.Show("Verbindung zum Server nicht möglich!") Application.Exit() End Try End While End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click streamw.WriteLine(TextBox1.Text) streamw.Flush() TextBox1.Clear() End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load nick = InputBox("Nickname: ", "Namen festlegen", "unknown") End Sub End Class |
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »kevin89« (19. Dezember 2009, 18:35)
Benutzer, die diesen Beitrag hilfreich fanden:
alecsoft, nxtman, oli-f, Studio2, BlackNetworkBit, Michael, xTruEx, MiNdFrReAk, powachill, Halfbax, Byte, TheMs, BlueKenny, Dennis960, Live, 360, Waijkey, GearTechDE, Digot - Software, qauqau, Slayers, xXjohnXx, JackBauer, Myrax, Tobi, Morphesus, KingLars, killermiller, BDG, Vendrin, vbxource, ebrithil, Acerman, Stylaa, fluffy, big-d, Ch0sen, Chriis, Bowserkoopa, Mister-X, Robin (Black-Knight), Triple-Axe, Flipez, the Gamer 3000, Genesis, Littleboy2009, rapper1400, themalta, Gredsoft, teddygun300, AliveDevil, oliver14800, xxgamerz, Nikx, julian2704, Jannis234, jmb.96, Huluman, alexanderw890i, Yannik, ShadowDialga, Jopi24, cookyman, Skype, BFDeluxe
Werde es späer ausprobieren,
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Taix« (18. November 2009, 21:34)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kevin89« (19. November 2009, 12:35)
Zumindest ab und zu...Hallo,Hi,
die Konsolenanwendung habe ich einfach aus dem Grund gewählt, weil der Server ja grundsätzlich kein GUI braucht. Natürlich kannst du den Server auch in eine Windows-Forms-Anwendung packen. Das Grundproblem ist nicht die Endlosschleife (die sich übrigens nur nach jeder neuen Verbindung in der Ausführung wiederholt), sondern die Stelle, wo so lange mit der Ausführung gewartet wird, bis eine neue Verbindung eingeht. Resultat ist eine Form ohne Reaktion, die also "einfriert".
Die Stelle mit dem Warten auf eine Verbindung kannst du daher einfach in einen separaten Thread packen. Somit sind auch weitere Benutzereingaben möglich. Bei der Konsole war das nicht nötig, bei einer Windows-Forms-Anwendung ist es das durchaus.
LG
|
|
Visual Basic Quellcode |
1 |
Private mainthread As New System.Threading.Thread(AddressOf ListenToNewConnection) |
|
|
Visual Basic Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Private Sub ListenToNewConnection() Console.WriteLine("Der Server läuft!") server = New TcpListener(ipendpoint) server.Start() While True ' wir warten auf eine neue verbindung... client = server.AcceptTcpClient Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection... c.stream = client.GetStream c.streamr = New StreamReader(c.stream) c.streamw = New StreamWriter(c.stream) c.nick = c.streamr.ReadLine ' falls das mit dem nick nicht gewünscht, auch diese zeile entfernen. list.Add(c) ' und fügen sie der liste der clients hinzu. Console.WriteLine(c.nick & " has joined.") ' falls alle anderen das auch lesen sollen können, an alle clients weiterleiten. siehe SendToAllClients Dim t As New Threading.Thread(AddressOf ListenToConnection) t.Start(c) End While End Sub |
|
|
Visual Basic Quellcode |
1 2 3 |
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load mainthread.Start() End Sub |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kevin89« (21. November 2009, 16:35)
Benutzer, die diesen Beitrag hilfreich fanden:
ein Uhrheberrechtsanspruch auf einen allgemeinen Code erheben, der wirklich nicht mehr als ein Grundgerüst ist?
Zitat
Der Code darf ohne Verweis nicht kopiert und ohne Genehmigung nicht anderweitig publiziert werden.
Benutzerinformationen überspringen
Dabei seit: 30. Oktober 2009
Wohnort: Berlin
Frühere Benutzernamen: Confix.npage.de
|
|
Visual Basic Quellcode |
1 |
Control.CheckForIllegalCrossThreadCalls = False |