Hallo zusammen,
ich programmiere gerade eine Windows-Forms-Anwendung (nachfolgend "ServerManager" genannt), die auf einem Root-Server laufen soll, und Game-Server starten, stoppen und updaten soll - soweit so gut. Das eigentliche Ziel ist allerdings, den ServerManager über einen Webserver (php) fernzusteuern. ServerManager und Webserver laufen auf dem gleichen Server.
Ich habe bereits mit einem TCP-Socket "experimentiert" und zunächst ein IRC (Server + Client) mit einem Tutorial programmiert. Somit habe ich neben dem ServerManager, der als Server arbeiten soll, auch einen Client, mit dem ich testen kann. Die Kommunikation zwischen dem ServerManager und dem IRC-Client funktioniert soweit auch. Der Listener läuft im Hintergrund, sodass die Bedienung der Oberfläche nicht beeinträchtig wird.
Das hier ist mein VB-net Code, mit dem die Kommunikation läuft:
und der dazugehörige Code im Hauptform:
Die Probleme fangen nun mit dem Webserver an.
Hier zunächst mal der (Test-)Code, mit dem ich das Ganze versucht habe:
Das Senden vom Webserver an den ServerManager klappt soweit auch. Allerdings stelle ich fest, dass wenn ich einmalig etwas vom Webserver an meinen IRC-Server sende, sich die Nachricht scheinbar ständig wiederholt wird (Ausgabe erfolgt in Textfeld, hier werden immer neue Zeilen erzeugt, beim Senden über den IRC-Client passiert das nicht).
Das ist schon mal das erste Fragezeichen..
Sobald ich im php-Skript die Antwort auslesen will, die von der Anwendung auch gesendet wird, scheint er nichts zu bekommen, und "läd" ewig die Seite weiter..
Hier verstehe ich nicht, warum hier nichts ankommt..
Das beides auf einer Kiste läuft, sollten Firewalls und so, keinen Einfluss darauf haben.
Kann mir hier jemand weiterhelfen, ich hab überhaupt keine Ahnung mehr, woran das liegen könnte...
Danke für eure Hilfe!
cya Igel
ich programmiere gerade eine Windows-Forms-Anwendung (nachfolgend "ServerManager" genannt), die auf einem Root-Server laufen soll, und Game-Server starten, stoppen und updaten soll - soweit so gut. Das eigentliche Ziel ist allerdings, den ServerManager über einen Webserver (php) fernzusteuern. ServerManager und Webserver laufen auf dem gleichen Server.
Ich habe bereits mit einem TCP-Socket "experimentiert" und zunächst ein IRC (Server + Client) mit einem Tutorial programmiert. Somit habe ich neben dem ServerManager, der als Server arbeiten soll, auch einen Client, mit dem ich testen kann. Die Kommunikation zwischen dem ServerManager und dem IRC-Client funktioniert soweit auch. Der Listener läuft im Hintergrund, sodass die Bedienung der Oberfläche nicht beeinträchtig wird.
Das hier ist mein VB-net Code, mit dem die Kommunikation läuft:
VB.NET-Quellcode
- Option Strict On
- Imports System.IO
- Imports System.Net
- Imports System.Net.Sockets
- Imports System.Threading
- Public Class TCPControl
- Public Event MessageReceived(sender As TCPControl, Data As String)
- ' SERVER CONFIG
- Public TCPServerIP As IPAddress = IPAddress.Parse("127.0.0.1")
- Public TCPServerPort As Integer = 4305
- Public TCPServer As TcpListener
- Private CommThread As Thread
- Private IsActivated As Boolean = True
- ' CLIENT
- Private Client As TcpClient
- Private ClientData As StreamReader
- Public Sub New()
- TCPServer = New TcpListener(TCPServerIP, TCPServerPort)
- TCPServer.Start()
- CommThread = New Thread(New ThreadStart(AddressOf Listening))
- CommThread.Start()
- End Sub
- Public Sub StartServer()
- IsActivated = True
- End Sub
- Public Sub StopServer()
- IsActivated = False
- End Sub
- Private Sub Listening()
- ' CREATE LISTENER LOOP
- Do Until IsActivated = False
- ' ACEPT INCOMING CONNECTIONS
- If TCPServer.Pending = True Then
- Client = TCPServer.AcceptTcpClient
- ClientData = New StreamReader(Client.GetStream)
- End If
- ' RAISE EVENT FOR INCOMING MESSAGES
- If ClientData IsNot Nothing Then
- Try
- RaiseEvent MessageReceived(Me, ClientData.ReadLine)
- Catch ex As Exception
- Console.WriteLine(ex.Message)
- End Try
- End If
- ' REDUCE CPU USAGE
- Thread.Sleep(100)
- Loop
- End Sub
- Sub SendToClient(ByVal Data As Object, Optional ByVal SilentMode As Boolean = False)
- If IsActivated = True Then
- Try
- Dim TX As New StreamWriter(Client.GetStream)
- TX.WriteLine(Data.ToString)
- TX.Flush()
- Catch ex As Exception
- If SilentMode = False Then MsgBox("SendToClient:" & vbCrLf & ex.Message)
- End Try
- End If
- End Sub
- End Class
und der dazugehörige Code im Hauptform:
VB.NET-Quellcode
- Public Class Mainfrm
- Private TCPServer As TCPControl
- Private Delegate Sub UpdateTextDelegate(RTB As RichTextBox, txt As String)
- Private Sub Mainfrm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- TCPServer = New TCPControl
- AddHandler TCPServer.MessageReceived, AddressOf OnLineReceived
- TCPServer.StartServer()
- '...
- end sub
- ' UPDATE TEXTBOX
- Private Sub UpdateText(RTB As RichTextBox, txt As String)
- If RTB.InvokeRequired Then
- RTB.Invoke(New UpdateTextDelegate(AddressOf UpdateText), New Object() {RTB, txt})
- Else
- If txt IsNot Nothing Then RTB.AppendText("[" & Format(Now, "dd.MM.yyyy HH:mm:ss") & "] " & txt & vbCrLf)
- End If
- End Sub
- Private Sub OnLineReceived(sender As TCPControl, Data As String)
- UpdateText(TaReceive, Data)
- ValidateRequestAndRespond(Data)
- End Sub
- ' ...
- end class
Die Probleme fangen nun mit dem Webserver an.
Hier zunächst mal der (Test-)Code, mit dem ich das Ganze versucht habe:
PHP-Quellcode
- <?php
- echo '<form method="post" action="./test.php">
- <input type="text" name="command" size="40"> <input type="submit" name="submit" value="senden"><br>
- <input type="checkbox" name="readresponse" value="1"> Antwort einlesen
- </form>';
- if(isset($_POST['submit'])) {
- if($_POST['command'] != '') {
- $address = '127.0.0.1';
- $service_port = '4305';
- $in = $_POST['command'];
- $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- if ($socket === false) {
- echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "<br>";
- } else {
- echo "OK.<br>";
- }
- echo "Versuche, zu '$address' auf Port '$service_port' zu verbinden ...<br>";
- $result = socket_connect($socket, $address, $service_port);
- if ($result === false) {
- echo "socket_connect() fehlgeschlagen.<br>Grund: ($result) " . socket_strerror(socket_last_error($socket)) . "<br>";
- } else {
- echo "OK.<br>";
- }
- echo "Sending command '".$in."'<br>";
- socket_write($socket, $in, strlen($in));
- echo "OK.<br><br>";
- echo "Socket schließen ...<br>";
- socket_close($socket);
- echo "OK.<br><br>";
- if(isset($_POST['readresponse'])) {
- echo '<hr><br>';
- $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- if ($socket === false) {
- echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "<br>";
- } else {
- echo "OK.<br>";
- }
- echo "Versuche, zu '$address' auf Port '$service_port' zu verbinden ...<br>";
- $result = socket_connect($socket, $address, $service_port);
- if ($result === false) {
- echo "socket_connect() fehlgeschlagen.<br>Grund: ($result) " . socket_strerror(socket_last_error($socket)) . "<br>";
- } else {
- echo "OK.<br>";
- }
- echo "Reading Response...<br>";
- $buf = socket_read ($socket, 2048, PHP_NORMAL_READ);
- echo 'Antwort: '.$buf.'<br><br>';
- echo "Socket schließen ...<br>";
- socket_close($socket);
- echo "OK.<br><br>";
- }
- ?>
Das Senden vom Webserver an den ServerManager klappt soweit auch. Allerdings stelle ich fest, dass wenn ich einmalig etwas vom Webserver an meinen IRC-Server sende, sich die Nachricht scheinbar ständig wiederholt wird (Ausgabe erfolgt in Textfeld, hier werden immer neue Zeilen erzeugt, beim Senden über den IRC-Client passiert das nicht).
Das ist schon mal das erste Fragezeichen..
Sobald ich im php-Skript die Antwort auslesen will, die von der Anwendung auch gesendet wird, scheint er nichts zu bekommen, und "läd" ewig die Seite weiter..
Hier verstehe ich nicht, warum hier nichts ankommt..
Das beides auf einer Kiste läuft, sollten Firewalls und so, keinen Einfluss darauf haben.
Kann mir hier jemand weiterhelfen, ich hab überhaupt keine Ahnung mehr, woran das liegen könnte...
Danke für eure Hilfe!
cya Igel
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Igel“ ()