Jump to content
Unity Insider Forum

Problem Serveranbindung


Tixewi

Recommended Posts

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...