Tixewi Geschrieben 25. März 2013 Melden Share Geschrieben 25. März 2013 Hi, ich habe Problem mein Unity Client mit meinem VB Server zu verbinden. Um genau zu sein eher damit die Daten vom Server in Unity auszulesen. Ich bekomme haufen "NULL" Meldungen in der Console, sobald ich auf Register drücke. Wenn ich nochmal auf Register drücke kommt hört es auf und haut mir manchmal noch die Fehlermeldung mit: "SocketException: Eine bestehende Verbindung wurde softwaregesteuert durch den Hostcomputer abgebrochen." Wenn ich das Spiel erneut starte ohne die "NULL" Meldungen durch einen zweiten klick zu stoppen friert Unity ein. Ansonst startet es ganz normal. Hier der Code: using System.Collections; using System.Net.Sockets; using System.IO; using System.Threading; public class MainMenu : MonoBehaviour { public string ActiveMenu; private NetworkStream stream; private StreamWriter streamw; private StreamReader streamr; private TcpClient client = new TcpClient(); private string request = ""; private string nickname = ""; private string password = ""; private string email = ""; string line; void Start() { request = "Register"; nickname = "Test"; password = "test"; email = "test@test.test"; ActiveMenu = "Menu_Main"; try { // Verbindung herstellen if(client.Connected == false) client.Connect("127.0.0.1", 8000); if(client.Connected) { stream = client.GetStream(); streamw = new StreamWriter(stream); streamr = new StreamReader(stream); Thread t = new Thread(new ThreadStart(Thread)); t.Start(); }else{ Debug.Log ("Verbindung nicht möglich"); Application.Quit(); } }catch{ Debug.Log ("Verbindung nicht möglich"); Application.Quit(); } } void OnGUI() { // GUI Abrufen if (ActiveMenu == "Menu_Main") Menu_Main(); if (ActiveMenu == "Menu_Register") Menu_Register(); } void Menu_Main() { if (GUI.Button(new Rect(10,10,150,35),"Create Account")) ActiveMenu = "Menu_Register"; } void Menu_Register() { if (GUI.Button(new Rect(10,10,150,35),"Back")) ActiveMenu = "Menu_Main"; if (GUI.Button(new Rect(10,50,150,35),"Register")) Register(); } void Register() { streamw.WriteLine ("CLOUD BRICK"); streamw.WriteLine(request + "|" + nickname + "|" + password + "|" + email); streamw.Flush(); } void Login() { streamw.WriteLine ("CLOUD BRICK"); streamw.WriteLine(request + "|" + nickname + "|" + password); streamw.Flush(); } public void Thread() { while (client.Connected){ try { //AddItem(streamr.ReadLine()); while((line = streamr.ReadLine()) != null) { Debug.Log (line); } } catch { } } } private void AddItem(string s) { if (s == "RegisterError") { } if (s == "RegisterSuccess") { } if (s == "FullServer") { } } } Im funktionierenden Visual Basic Client sind 2 Unterschiede. 1. Deklaration: Private Delegate Sub DAddItem(ByVal s As String) 2. Thread Void ist hier anders: 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 und hier der Server: Imports System.Net.Sockets Imports System.IO Imports System.Net Imports MySql.Data.MySqlClient Module Server 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) Public max_user As Integer Dim current_user As Integer Dim player As New Connection Dim con As New MySqlConnection Dim cmd As New MySqlCommand Dim sqlr As MySqlDataReader Private Structure Connection Dim stream As NetworkStream Dim streamw As StreamWriter Dim streamr As StreamReader Dim request As String Dim nickname As String Dim password As String Dim email As String End Structure Private Sub SendToAllClients(ByVal s As String) For Each player As Connection In list 'An alle Clienten Senden Try player.streamw.WriteLine(s) player.streamw.Flush() Catch End Try Next End Sub Sub Main() '---------------------------------------------------- 'Server laden Console.WriteLine("- - - - CLOUD BRICK SERVER - - - -") Console.WriteLine("IP Endpoint: " & ipendpoint.ToString) current_user = "0" Console.WriteLine("Max user: " & max_user) Console.WriteLine("- - - - - - - - - - - - -") '---------------------------------------------------- con.ConnectionString = "Server=localhost;User Id=root;Database=Kyeile" cmd.Connection = con Console.WriteLine("The server is running! - " + Format(System.DateTime.UtcNow, "yyyy-MM-d HH:mm:ss")) server = New TcpListener(ipendpoint) server.Start() While True 'Auf Verbindung warten client = server.AcceptTcpClient con.Open() '---------------------------------------------------- 'Connection für neue Verbindung erstellen player.stream = client.GetStream player.streamr = New StreamReader(player.stream) player.streamw = New StreamWriter(player.stream) '---------------------------------------------------- '---------------------------------------------------- 'Kommt abfrage an Try If player.streamr.ReadLine = "CLOUD BRICK" Then 'Login/Registration Try Dim tmp As String = player.streamr.ReadLine 'Auf Empfang warten Dim arrayList() As String = tmp.ToString.Split("|") player.request = arrayList(0) Catch ex As Exception MsgBox(ex.Message) End Try cmd.CommandText = "SELECT * FROM user WHERE user_id='Tixewi'" Register("Test", "test", "test@test.de", player) 'Login("Test", "test", player) End If Catch ex As Exception MsgBox(ex.Message) End Try con.Close() End While End Sub Private Sub ListenToConnection(ByVal connection As Connection) Do Try Dim tmp As String = connection.streamr.ReadLine 'Auf Empfang warten Dim arrayList() As String = tmp.ToString.Split("|") connection.request = arrayList(0) 'Chat? '---------------------------------------------------- 'Auf Empfang warten Try connection.nickname = arrayList(1) '---------------------------------------------------- '---------------------------------------------------- 'Aufgabe prüfen connection.request = arrayList(0) 'Variablen für Register If connection.request = "Register" Then connection.password = arrayList(2) connection.email = arrayList(3) End If 'Variablen für Login If connection.request = "Login" Then connection.password = arrayList(2) End If If connection.request = "Register" Then Register(connection.nickname, connection.password, connection.email, connection) If connection.request = "Login" Then Login(connection.nickname, connection.password, connection) Catch ex As Exception End Try '---------------------------------------------------- Catch 'Wenn eine Verbindung zu einem Client nicht mehr aufgebaut werden kann.. list.Remove(connection) current_user -= 1 Console.WriteLine(connection.nickname & " has left. | Online: " + current_user.ToString + " - " + Format(System.DateTime.UtcNow, "yyyy-MM-d HH:mm:ss")) Exit Do End Try Loop End Sub Private Sub Register(ByVal register_nickname As String, ByVal register_password As String, ByVal register_email As String, ByVal connection As Connection) '---------------------------------------------------- Try 'Prüfen ob Account existiert cmd.CommandText = "SELECT COUNT(user_id) FROM user WHERE user_id = '" & register_nickname & "';" sqlr = cmd.ExecuteReader() Dim exists As String Do While sqlr.Read() exists = sqlr("COUNT(user_id)") Loop sqlr.Close() If exists = "0" Then 'Account anlegen cmd.CommandText = "INSERT INTO user VALUES ('" & register_nickname & "', '" & register_password & "', '" & register_email & "', '" & Format(System.DateTime.UtcNow, "yyyy-MM-d HH:mm:ss") & "', '" & Format(System.DateTime.UtcNow, "yyyy-MM-d HH:mm:ss") & "', 0, 0);" sqlr = cmd.ExecuteReader() Do While sqlr.Read() Console.WriteLine(sqlr("user_id")) Loop sqlr.Close() 'Account angelegt Console.WriteLine(register_nickname + " was registrated." + " - " + Format(System.DateTime.UtcNow, "yyyy-MM-d HH:mm:ss")) connection.streamw.WriteLine("RegisterSuccess") connection.streamw.Flush() 'Login Login("Test", "test", player) Else connection.streamw.WriteLine("Duplicate") connection.streamw.Flush() End If Catch ex As Exception connection.streamw.WriteLine("RegisterError") connection.streamw.Flush() End Try connection.stream.Close() '---------------------------------------------------- End Sub Private Sub Login(ByVal login_nickname As String, ByVal login_password As String, ByVal connection As Connection) 'Ist der Server voll? If current_user <= max_user Then Try 'Login Daten prüfen cmd.CommandText = "SELECT COUNT(user_id) FROM user WHERE user_id = '" & login_nickname & "' AND password='" & login_password & "';" sqlr = cmd.ExecuteReader() Dim correct As String Do While sqlr.Read() correct = sqlr("COUNT(user_id)") Loop sqlr.Close() If correct = "1" Then 'Ist der Spieler gebannt? cmd.CommandText = "SELECT banned FROM user WHERE user_id = '" & login_nickname & "';" sqlr = cmd.ExecuteReader() Dim banned As String Do While sqlr.Read() banned = sqlr("banned") Loop If banned = False Then 'Session Key generiert -> ID + Session Key an Client gesendet = 30 Zeichen (Nur bei Login) '---------------------------------------------------- 'Session Key If player.streamr.ReadLine = "Toastbrot mit Ketchup" Then player.streamw.WriteLine("ACCE") player.streamw.Flush() '---------------------------------------------------- 'Erfolgreicher Login connection.streamw.WriteLine("LoginSuccess") connection.streamw.Flush() 'Last Login überarbeiten cmd.CommandText = "UPDATE user SET last_login='" & Format(System.DateTime.UtcNow, "yyyy-MM-d HH:mm:ss") & "' WHERE user_id = '" & login_nickname & "';" '---------------------------------------------------- '---------------------------------------------------- 'Verbindung in der Liste der Clienten hinzufügen list.Add(player) current_user += 1 Console.WriteLine("Test has joint. | Online: " + current_user.ToString + " - " + Format(System.DateTime.UtcNow, "yyyy-MM-d HH:mm:ss")) '---------------------------------------------------- '---------------------------------------------------- 'Thread starten Dim thread As New Threading.Thread(AddressOf ListenToConnection) thread.Start(player) '---------------------------------------------------- End If Else connection.streamw.WriteLine("Banned") connection.streamw.Flush() End If Else connection.streamw.WriteLine("IncorrectLogin") connection.streamw.Flush() End If sqlr.Close() Catch ex As Exception MsgBox(ex.Message) connection.streamw.WriteLine("LoginError") connection.streamw.Flush() End Try Else connection.streamw.WriteLine("FullServer") connection.streamw.Flush() connection.streamw.Close() connection.streamr.Close() End If End Sub End Module Hoffe ihr könnt mir helfen. Danke schomal im Vorraus mfg Tixewi Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Schlumpf Geschrieben 25. März 2013 Melden Share Geschrieben 25. März 2013 ich habe ja keinen socket server in .net aber wenn du schon den fehler bekommst das dein SERVER die verbindung trennt warum postest du dann den client code ? warum in vb und nicht in c# was meldet das serverlog Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tixewi Geschrieben 25. März 2013 Autor Melden Share Geschrieben 25. März 2013 Habe den Server oben gepostet - da kommt bei mir aber keine Meldung. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Schlumpf Geschrieben 25. März 2013 Melden Share Geschrieben 25. März 2013 ganz ehrlich, mach das networking tutorial dann wenn du auswending in js oder c# den client und den server bauen kannst schau dir deinen code vomm server und vom client nochmal an da sind ein paar sachen drin die man nicht machen sollte alleine try zu nutzen beim verbinden und keinen echten fehler auszugeben oder try beim thread zu nutzen ohne >> /dev/log.txt die fehler zu speichern oder einen socket im threadzu starten und die cance zu haben das mit Application.Quit() ein ghost entsteht ... if(client.Connected) { stream = client.GetStream(); streamw = new StreamWriter(stream); streamr = new StreamReader(stream); Thread t = new Thread(new ThreadStart(Thread)); t.Start(); }else{ Debug.Log ("Verbindung nicht möglich"); Application.Quit(); } }catch{ Debug.Log ("Verbindung nicht möglich"); Application.Quit(); } mach bitte die tutorials danach : edit : reduziere deinen client und den server auf das minimalistischste was geht und packe jede "aktion" auf einen gui button das nichts ohne " maus taste" passiert so kannst du prüfen was wann wo falsch läuft Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tixewi Geschrieben 25. März 2013 Autor Melden Share Geschrieben 25. März 2013 Die turorials würden mir nichts bringen, da sie für das Unity Network sind. Ich müsste mir normale Socket Tutorial anschauen. Wie kann ich den Thread durch ein async void ersetzten? Ich finde dazu kaum was. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.