Hallo Leute
Ich hab gerade ein Programm angefangen und möchte ein unabhängiges Peer to Peer (P2P) Netzwerk aufbauen, also ohne zentralen Server. Dazu läuft auf jedem PC ein Server und ein Client gleichzeitig.
Jetzt ist das problem: ohne festen Server weiss ich die IP-Adresse(n) nicht, mit welcher sich der client verbinden soll...
Und dann hab ich noch eine andere frage: wie kann ich den server und denn client gleichzeitig starten, weil der server wartet auf verbindung und blockiert dann den rest...
Spoiler anzeigen
thx im voraus und mfg
nicu96
Ich hab gerade ein Programm angefangen und möchte ein unabhängiges Peer to Peer (P2P) Netzwerk aufbauen, also ohne zentralen Server. Dazu läuft auf jedem PC ein Server und ein Client gleichzeitig.
Jetzt ist das problem: ohne festen Server weiss ich die IP-Adresse(n) nicht, mit welcher sich der client verbinden soll...
Und dann hab ich noch eine andere frage: wie kann ich den server und denn client gleichzeitig starten, weil der server wartet auf verbindung und blockiert dann den rest...
VB.NET-Quellcode
- Imports System.IO
- Imports System.Net.Sockets
- Imports System.Threading
- Imports System.Net
- Imports System.Text
- Public Structure Conn
- Dim stream As NetworkStream
- Dim streamw As StreamWriter
- Dim streamr As StreamReader
- Dim nick As String
- Dim IP As String
- End Structure
- '================
- ' *** main ***
- '================
- Public Class Main
- Public nick As String
- Public myIP As String
- Dim serv As New server
- Dim clie As New client
- Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Dim request As HttpWebRequest = DirectCast(WebRequest.Create("http://nicu96ftp.square7.ch/stuff/ip.php"), HttpWebRequest) 'in dieser Zeile deine URL angeben
- Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
- Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
- myIP = reader.ReadToEnd()
- If Not response Is Nothing Then response.Close()
- 'server & client starten
- End Sub
- Public Sub WriteStr(ByVal s As String)
- rtb.Text += s & vbCrLf
- End Sub
- End Class
- '==================
- ' *** client ***
- '==================
- Public Class client
- Private stream As NetworkStream
- Private streamw As StreamWriter
- Private streamr As StreamReader
- Private client As New TcpClient
- Private t As New Thread(AddressOf Listen)
- Private Delegate Sub DWriteStr(ByVal s As String)
- Public nick As String = "unknown"
- Public Sub Start()
- Try
- client.Connect("127.0.0.1", 44444)
- If client.Connected Then
- stream = client.GetStream
- streamw = New StreamWriter(stream)
- streamr = New StreamReader(stream)
- streamw.WriteLine(nick & "@" & Main.myIP)
- 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
- Main.Invoke(New DWriteStr(AddressOf Main.WriteStr), streamr.ReadLine)
- Catch
- Main.WriteStr("Verbindung zum Server nicht möglich!")
- Application.Exit()
- End Try
- End While
- End Sub
- Public Sub SendMsg(ByVal sender As System.Object, ByVal e As System.EventArgs)
- streamw.WriteLine(Main.msg.Text)
- streamw.Flush()
- Main.msg.Clear()
- End Sub
- End Class
- '==================
- ' *** server ***
- '==================
- Public Class server
- Private server As TcpListener
- Private client As New TcpClient
- Private ipendpoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 44444)
- Private list As New List(Of Conn)
- Public Sub Start()
- server = New TcpListener(ipendpoint)
- server.Start()
- Main.WriteStr("Der Server läuft!")
- While True
- client = server.AcceptTcpClient
- Dim c As New Conn
- c.stream = client.GetStream
- c.streamr = New StreamReader(c.stream)
- c.streamw = New StreamWriter(c.stream)
- Dim nickip() As String = c.streamr.ReadLine.Split(CChar("@"))
- c.nick = nickip(0)
- c.IP = nickip(1)
- list.Add(c)
- Main.WriteStr(c.nick & " has joined.")
- Dim t As New Threading.Thread(AddressOf ListenToConnection)
- t.Start(c)
- End While
- End Sub
- Private Sub ListenToConnection(ByVal con As Conn)
- Do
- Try
- Dim tmp As String = con.streamr.ReadLine
- Main.WriteStr(con.nick & ": " & tmp)
- For Each c As Conn In list
- Try
- c.streamw.WriteLine(con.nick & ": " & tmp)
- c.streamw.Flush()
- Catch
- End Try
- Next
- Catch
- list.Remove(con)
- Main.WriteStr(con.nick & " has exit.")
- Exit Do
- End Try
- Loop
- End Sub
- End Class
thx im voraus und mfg
nicu96
OS: Linux Peppermint & Windows 7
Processor: AMD Phenom II X6 1055T @ 3.5 GHz
RAM: 8 GB Kingston ValueRAM
GFX: NVIDIA GeForce 210