|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sveen
Anmeldungsdatum: 31.10.2018 Beiträge: 4
|
Verfasst am: 31.10.2018, 21:23 Titel: TSNE_v3 Variablen zwischen 2 Clients austauschen |
|
|
Kurz Frage an alle die sich mit TSNE auskennen. Ich wollte fragen ob mir jemand (wenn das schnell möglich ist) einen Beispiel Client / Server programmieren könnte in dem man beim ersten Client was reinschreiben kann und das dann vom Server auf den anderen Client übertragen wird.
Ich bin kein Programmierer und probiere nur ein paar Sachen aus. Das ist der Grund warum ich mit TSNE nicht viel anfangen kann.
Danke schon mal im voraus [/b] |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 01.11.2018, 02:34 Titel: |
|
|
Hallo und willkommen im Forum!
Für eine maßgeschneiderte Lösung müsstest du etwas konkreter sagen, was du haben möchtest, aber hier als kleines Appetithäppchen eine Server/Client - Paarung, mit der du eine Datei in einem Netzwerk übertragen kannst:
Server: Code: | #Include Once "TSNE_V3.bi"
Type Client_Type
V_InUse As UByte
V_TSNEID As UInteger
V_IPA As String
V_Data As String
End Type
Dim Shared ClientD() As Client_Type
Dim Shared ClientCount As UInteger
Dim Shared ClientMutex As Any Ptr
Dim G_Server_TSNEID As UInteger
Dim RV As Integer
Dim Shared As UInteger globalTSNEID
Function parse(text As String = "", separator As String = "") As String
Static As String s, t, r
Static As Integer b, e
If separator = Chr(0) Then 'return the rest of the text
r = Mid(t, e + 1)
e = Len(t)
Return r
ElseIf Len(separator) Then
s = separator
EndIf
If Len(text) Then 'new text
t = text
e = 0 'pointer to beginning
EndIf
b = e + 1 'pointer behind last word
Do While InStr(s, Mid(t, b, Len(s))) 'seek next beginning of word
If b >= Len(t) Then
Return ""
EndIf
b += Len(s)
Loop
e = b
Do
'If Mid(t, e, 1) = """" Then 'quotation marks
' Do 'seek end of the quoted text
' e += 1
' If e > Len(t) Then 'text ended
' Exit Do, Do
' EndIf
' Loop Until Mid(t, e, 1) = """"
'EndIf
e += 1
If e > Len(t) Then 'text ended
Exit Do
EndIf
Loop Until InStr(s, Mid(t, e, Len(s))) 'found separator
e -= 1 'set pointer in front of separator
r = Mid(t, b, e - b + 1) 'cut text
Return r
End Function
Sub TSNE_Disconnected(ByVal V_TSNEID As UInteger)
Print "[Disconnected] TSNEID: "; V_TSNEID
MutexLock(ClientMutex)
For X As UInteger = 1 To ClientCount
If ClientD(X).V_InUse = 1 Then
If ClientD(X).V_TSNEID = V_TSNEID Then
ClientD(X).V_InUse = 0
Exit For
End If
End If
Next
MutexUnLock(ClientMutex)
End Sub
Sub TSNE_Connected(ByVal V_TSNEID As UInteger)
Print "[Connected] TSNEID: "; V_TSNEID
End Sub
Sub TSNE_NewData(ByVal V_TSNEID As UInteger, ByRef V_Data As String)
Dim As Integer RV, ff
Dim As String fi, g, request
Print "[NewData] TSNEID: "; V_TSNEID; " Datenlänge: "; Len(V_Data)
request = parse(V_DATA, Chr(13, 10))
Select Case LCase(request)
Case "sendfile" 'client requests a file
fi = parse() 'get file name
ff = FreeFile
If Open (fi For Binary Access Read As #ff) Then
RV = TSNE_Data_Send(V_TSNEID, "nosuchfile " & fi & Chr(13,10) & "0 Bytes" & Chr(13,10))
Else 'send file
'response header
RV = TSNE_Data_Send(V_TSNEID, _
"requestedfile " & fi & Chr(13,10) & _
Lof(ff) & " Bytes" & Chr(13,10))
If RV <> TSNE_Const_NoError Then
Print "[ERROR] " & TSNE_GetGURUCode(RV)
Close ff
Exit Sub
End If
Do Until Eof(ff) 'send file data
g = Input(1024, ff)
RV = TSNE_Data_Send(V_TSNEID, g)
If RV <> TSNE_Const_NoError Then
Print "[ERROR] " & TSNE_GetGURUCode(RV)
Close ff
Exit Sub
End If
Loop
Close ff
EndIf
End Select
End Sub
Sub TSNE_NewConnection(ByVal V_TSNEID As UInteger, ByVal V_RequestID As Socket, ByVal V_IPA As String)
Dim CIndex As UInteger
Dim RV As Integer
Dim NewTSNEID As UInteger
Dim TCUDT As Client_Type
MutexLock(ClientMutex)
For X As UInteger = 1 To ClientCount
If ClientD(X).V_InUse = 0 Then CIndex = X: Exit For
Next
If CIndex = 0 Then
If ClientCount = 250 Then
RV = TSNE_Create_Accept(V_RequestID, NewTSNEID, , 0, 0, 0)
If NewTSNEID = 0 Then TSNE_Disconnect(NewTSNEID)
Exit Sub
End If
ClientCount += 1
CIndex = ClientCount
ReDim Preserve ClientD(ClientCount) As CLient_Type
End If
ClientD(CIndex) = TCUDT
RV = TSNE_Create_Accept(V_RequestID, NewTSNEID, , @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData)
globalTSNEID = NewTSNEID
With ClientD(CIndex)
.V_InUse = 1
.V_TSNEID = NewTSNEID
.V_IPA = V_IPA
If RV <> TSNE_Const_NoError Then
MutexUnlock(ClientMutex)
Print "[ACCEPT] [ERROR] " & TSNE_GetGURUCode(RV)
Exit Sub
End If
End With
MutexUnlock(ClientMutex)
Print "[ACCEPT] TSNEID: " & NewTSNEID; " IPA: "; V_IPA
End Sub
'------------------------------------------------------
ClientMutex = MutexCreate
RV = TSNE_Create_Server(G_Server_TSNEID, 1234, 10, @TSNE_NewConnection, 0)
If RV <> TSNE_Const_NoError Then
Print "[ERROR] " & TSNE_GetGURUCode(RV) & RV
Sleep 5000
End
End If
Do Until InKey() = Chr(27)
Sleep 1, 1
Loop
'disconnect all clients
MutexLock(ClientMutex)
For X As UInteger = 1 To ClientCount
If ClientD(X).V_InUse > 0 Then
If ClientD(X).V_TSNEID > 0 Then
TSNE_Disconnect(ClientD(X).V_TSNEID)
End If
End If
Next
MutexUnlock(ClientMutex)
MutexLock(ClientMutex)
For X As UInteger = 1 To ClientCount
If ClientD(X).V_InUse > 0 Then
If ClientD(X).V_TSNEID > 0 Then
MutexUnlock(ClientMutex)
TSNE_WaitClose(ClientD(X).V_TSNEID)
MutexLock(ClientMutex)
End If
End If
Next
MutexUnlock(ClientMutex)
MutexDestroy ClientMutex
End 0 |
Client: Code: | #Include Once "TSNE_V3.bi"
Dim G_Client_TSNEID As UInteger
Dim Shared As Integer conn, sff, tofile, disconn, bytes
Dim Shared As String reqfile, savfile
Function parse(text As String = "", separator As String = "") As String
Static As String s, t, r
Static As Integer b, e
If separator = Chr(0) Then 'return the rest of the text
r = Mid(t, e + 1)
e = Len(t)
Return r
ElseIf Len(separator) Then
s = separator
EndIf
If Len(text) Then 'new text
t = text
e = 0 'pointer to beginning
EndIf
b = e + 1 'pointer behind last word
Do While InStr(s, Mid(t, b, Len(s))) 'seek next beginning of word
If b >= Len(t) Then
Return ""
EndIf
b += Len(s)
Loop
e = b
Do
'If Mid(t, e, 1) = """" Then 'quotation marks
' Do 'seek end of the quoted text
' e += 1
' If e > Len(t) Then 'text ended
' Exit Do, Do
' EndIf
' Loop Until Mid(t, e, 1) = """"
'EndIf
e += 1
If e > Len(t) Then 'text ended
Exit Do
EndIf
Loop Until InStr(s, Mid(t, e, Len(s))) 'found separator
e -= 1 'set pointer in front of separator
r = Mid(t, b, e - b + 1) 'cut text
Return r
End Function
Sub TSNE_Disconnected(ByVal V_TSNEID As UInteger)
Close tofile
tofile = 0
Print "[Disconnected] TSNEID: "; V_TSNEID
conn = 0
End Sub
Sub TSNE_Connected(ByVal V_TSNEID As UInteger)
Print "[Connected] TSNEID: "; V_TSNEID
conn = 1
Dim RV As Integer
RV = TSNE_Data_Send(V_TSNEID, "SendFile" & Chr(13, 10) & reqfile & Chr(13, 10))
If RV <> TSNE_Const_NoError Then
Print "[ERROR] " & TSNE_GetGURUCode(RV)
conn = 0
TSNE_Disconnect(V_TSNEID)
End If
End Sub
Sub TSNE_NewData(ByVal V_TSNEID As UInteger, ByRef V_Data As String)
Dim As Integer ff
Dim As String fi, g, response
If tofile = 0 Then
response = parse(V_DATA, Chr(13,10))
Print response
Select Case LCase(response)
Case "requestedfile " & reqfile
g = parse()
bytes = Val(g) 'length of the file
tofile = FreeFile
Open savfile For Output As #tofile
Print g
End Select
Else
Print #tofile, V_DATA;
Print Int(100 * Lof(tofile) / bytes);"%" 'show progress
Locate CsrLin - 1, 1, 0
If Lof(tofile) = bytes Then 'transmission done
Close tofile
disconn = 1
Print
EndIf
EndIf
End Sub
Dim RV As Integer
reqfile = "g:\#01sb041216.mp2" 'requested file. replace by a file of your own
savfile = "g:\#01sb.mp2" 'file to save to
Do
Select Case conn
Case 0
'IP address 127.0.0.1 means "localhost" = server and client are running on the same
' computer. replace by appropriate IP if required
RV = TSNE_Create_Client(G_Client_TSNEID, "127.0.0.1", 1234, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData)
If RV <> TSNE_Const_NoError Then
Print "[ERROR] " & RV & " " & TSNE_GetGURUCode(RV)
Sleep 1000
End
End If
Case 1
Sleep 1
End Select
Loop Until (InKey() = Chr(27)) Or (disconn = 1)
Print "Disconnect"
TSNE_Disconnect(G_Client_TSNEID)
Print "WaitClose"
TSNE_WaitClose(G_Client_TSNEID)
Sleep 3000
|
Ersetze "reqfile" (im Client - Code) durch den Namen der Datei, die übertragen werden soll und "savfile" durch den gewünschten Namen der Zieldatei (Achtung: Die Zieldatei wird ohne Rückfrage überschrieben!).
Wenn Server und Client auf zwei verschiedenen Rechnern laufen, muß in der Zeile Code: | RV = TSNE_Create_Client(G_Client_TSNEID, "127.0.0.1", 1234, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData) | die localhost - Adresse "127.0.0.1" durch die IP - Adresse oder die URL des Servers ersetzt werden.
Die Include - Datei "TSNE_V3.bi" findest du hier.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Sveen
Anmeldungsdatum: 31.10.2018 Beiträge: 4
|
Verfasst am: 02.11.2018, 17:28 Titel: |
|
|
Zuerst mal vielen Dank für diesen Aufwand den du betrieben hast um mir ein Beispiel zu programmieren. Ich musste bis jetzt irgentwie immer alles alleine herausfinden und dachte bei diesem Problem könnte ich ja mal andere Leute fragen. Aber ich hätte nie gedacht das ich so schnell eine Antwort kriege.
Was du hier geschrieben hast werde ich sicher mal genauer anschauen aber es ist nicht so wie ich es mir vorgestellt habe. (das liegt an meiner schwachen Beschreibung)
Einfach kurz damit du weisst was ich eigentlich gemeint habe
Client 1:
Hat eine Variable (Integer X1 (zb 20))
vvv
Diese Variable möchte ich dann auf denn Server übertragen.
Client 1 > (X1) > Server
vvv
und der Server sendet dann die Variable an Client 2
vvv
Client 2:
Und Client 2 setzt dann diese X1(20) in X2 und somit habe ich dann zb die X Koordianten vom anderen Client.
Falls es dich wundert ich probiere ein simples Multiplayer Spiel zu machen und da ich programmieren ja nicht beruflich mache, war die erst beste Idee genau das, einfach die x/y Koordinaten auszutausch zwischen den 2 Clients
So das ist noch alles was ich dazu sagen wollte.
Und noch mals vielen Dank für den anderen Code ich werde sicher eine Verwendung dafür finden grinsen |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 02.11.2018, 17:56 Titel: |
|
|
SERVER:
Code: | '##############################################################################################################
'TEST-SERVER für TSNE Version 3
'##############################################################################################################
'##############################################################################################################
#define TSNE_DEF_REUSER
#include once "TSNE_V3.bi" 'Die TCP Netzwerkbibliotek integrieren
'##############################################################################################################
Dim Shared G_Server as UInteger 'Eine Variable für den Server-Handel erstellen
'##############################################################################################################
Type Client_Type 'Ein UDT welches die einzelnen Verbindungen und deren Parameter hält
V_InUse as UByte 'Wird verwendet um zu überprüfen ob der Eintrag belegt ist
V_TSNEID as UInteger 'Speicher die TSNEID der Verbindung
End Type
Dim Shared ClientD() as Client_Type 'Das UDT-Array für die Clienten
Dim Shared ClientC as UShort 'Hier reicht ein Short aus, da mehr als 65535 Verbindugnen sowieso nicht möglich sind (Portbegrenzung).
Dim Shared ClientMutex as Any Ptr 'Wir erstellen ein MUTEX welches verhindert das mehrere verbindugen gleichzeitg auf das UDT zugreifen
'##############################################################################################################
Sub TSNE_Disconnected(ByVal V_TSNEID as UInteger) 'Empfänger für das Disconnect Signal (Verbindung beendet)
MutexLock(ClientMutex) 'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC 'Wir gehen alle Array-Elemente durch
If ClientD(X).V_InUse = 1 Then 'Wird das Element verwendet?
If ClientD(X).V_TSNEID = V_TSNEID Then 'Ist das Element das gesuchte?
ClientD(X).V_InUse = 0 'Da dieses Element nun nicht mehr gebraucht wird können wir dieses als 'Nicht in nutzung' markieren
Print "[CLIENT] Disconnected >" & V_TSNEID & "<" 'und ausgeben das wir die verbindung beendet haben
MutexUnLock(ClientMutex) 'Mutex Sperre kann jetz taufgehoben werden, da es sonst zu einem MUTEX Leak kommt wenn wir die Sub direkt verlassen
Exit Sub 'Sub direkt verlassen
End If
End If
Next
MutexUnLock(ClientMutex) 'Mutex Sperren aufheben
Print "[CLIENT] [ERROR] TSNEID Not found in Client-Array" 'Wir haben kein passendes Element gefunden udn geben das aus.
End Sub
'##############################################################################################################
Sub TSNE_Connected(ByVal V_TSNEID as UInteger) 'Empfänger für das Connect Signal (Verbindung besteht)
MutexLock(ClientMutex) 'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC 'Wir gehen alle Array-Elemente durch
If ClientD(X).V_InUse = 1 Then 'Wird das Element verwendet?
If ClientD(X).V_TSNEID = V_TSNEID Then 'Ist das Element das gesuchte?
Print "[CLIENT] Connected >" & V_TSNEID & "<" 'und ausgeben das die client-verbindung vollständig hergestellt wurde
MutexUnLock(ClientMutex) 'Mutex Sperre kann jetz taufgehoben werden, da es sonst zu einem MUTEX Leak kommt wenn wir die Sub direkt verlassen
Exit Sub 'Sub direkt verlassen
End If
End If
Next
MutexUnLock(ClientMutex) 'Mutex Sperren aufheben
Print "[CLIENT] [ERROR] TSNEID Not found in Client-Array" 'Wir haben kein passendes Element gefunden und geben das aus.
End Sub
'##############################################################################################################
Sub TSNE_NewData(ByVal V_TSNEID as UInteger, ByRef V_Data as String) 'Empfänger für neue Daten
Print "[CLIENT] Data >" & V_TSNEID & "<___>" & V_Data & "<" 'und ausgeben das die client-verbindung vollständig hergestellt wurde
MutexLock(ClientMutex) 'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC 'Wir gehen alle Array-Elemente (Clienten) durch
If ClientD(X).V_InUse = 1 Then 'Wird das Element verwendet?
If ClientD(X).V_TSNEID <> V_TSNEID Then 'Ist der Client NICHT der gleiche wie der Sender?
Print "[CLIENT] SEND >" & ClientD(X).V_TSNEID & "<___>" & V_Data & "<" 'und ausgeben das die client-verbindung vollständig hergestellt wurde
TSNE_Data_Send(ClientD(X).V_TSNEID, V_Data) 'Wir senden die eingehenden Daten an den Clienten
End If
End If
Next
MutexUnLock(ClientMutex) 'Mutex Sperren aufheben
End Sub
'##############################################################################################################
Sub TSNE_NewConnection(ByVal V_TSNEID as UInteger, ByVal V_RequestID as Socket, ByVal V_IPA as String) 'Empfänger für das NewConnection Signal (Neue Verbindung)
Dim TNewTSNEID as UInteger 'Eine Variable welche die Neue TSNEID beinhaltet
Dim TReturnIPA as String 'Eine Variable welche die IP-Adresse des clienten beinhaltet
Dim CIndex as UInteger 'Eine Variable erstellen welche einen freien Array index speichert
Dim RV as Integer 'Die Statusrückgabe variable
MutexLock(ClientMutex) 'Mutex Sperren um auf das Array zugreifen zu können
For X as UInteger = 1 to ClientC 'Wir gehen alle Array-Elemente durch
If ClientD(X).V_InUse = 0 Then 'Haben wir ein Freies Element gefunden?
CIndex = X 'Dann diesen Index abspeichern
Exit For 'Und schleife verlassen
End If
Next
If CIndex = 0 Then 'Haben wir kein freies Feld gefunden?
If ClientC >= 100 Then 'Haben wir noch platz für einen Client oder wurde schon unser definiertes Maximum erreich?
Print "[CLIENT] FULL!!! IPA:" & V_IPA 'Wir zeigen an, das unser Server voll ist. und geben die IPA aus.
RV = TSNE_Create_Accept(V_RequestID, TNewTSNEID, TReturnIPA, 0, 0, 0) 'Da wir kein Platz mehr haben akzeptieren wir pauschal die verbindung ohne Callback-sub's anzugeben (werden sowieso nicht benötigt).
If RV <> TSNE_Const_NoError Then 'Gab es einen Fehler beim 'Accept'?
Print "[CLIENT] [FEHLER] " & TSNE_GetGURUCode(RV) 'Dann geben wir diesen aus
MutexUnLock(ClientMutex) 'Entsperren das Mutex
Exit Sub 'und verlassen auf direktem wege die sub
End If
TSNE_Disconnect(TNewTSNEID) 'Zum schluss beenden wir die Verbindung, da sie sowieso nicht von uns weiter verwaltet wird.
MutexUnLock(ClientMutex) 'Noch das MUTEX entsperren
Exit Sub 'und die Sub auf direktem wege verlassen
End If
ClientC += 1 'Ist noch Platz frei erstellen wir ein neues Element
Redim Preserve ClientD(ClientC) as Client_Type 'Und redimensionieren (mit 'Preserve' für das erhalten der anderen Element-daten) das Array
CIndex = ClientC 'Als Freien Index geben wir das neue Element an
End If
Dim TMyIPA as String 'Erhält von er Accept die IP-Adresse dieses Servers, so wie der Client sie sieht.
RV = TSNE_Create_Accept(V_RequestID, TNewTSNEID, TReturnIPA, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData, TMyIPA) 'Da wir noch platz haben akzeptieren wir die verbindung mit den Callbacks
If RV <> TSNE_Const_NoError Then 'Gab es einen Fehler beim 'Accept'?
Print "[CLIENT] [FEHLER] " & TSNE_GetGURUCode(RV) 'Dann geben wir diesen aus
MutexUnLock(ClientMutex) 'Entsperren das Mutex
Exit Sub 'und verlassen auf direktem wege die sub
End If
With ClientD(CIndex) 'Kein fehler entsanden? dann das freie Element selektieren
.V_InUse = 1 'und markieren es als 'In Nutzung'
.V_TSNEID = TNewTSNEID 'TSNEID der neuen Verbindung speichern
End With
Print "[CLIENT] New Connect >" & V_TSNEID & "< IPA:" & V_IPA & " MyIPA:"; TMyIPA 'Anzeigen das Verbindung akzeptiert wurde.
MutexUnLock(ClientMutex) 'Mutex Sperren aufheben
End Sub
'##############################################################################################################
Print "[INIT] Setup..." 'Signalisieren das wir das Programm starten
ClientMutex = MutexCreate() 'Ein neues MUTEX erstellen
Dim RV as Integer 'Eine Statusrückgabe Variable
Print "[SERVER] Init..." 'Signalisieren das wir den Server jetzt inizialisieren
RV = TSNE_Create_Server(G_Server, 1234, 10, @TSNE_NewConnection) 'Server erstellen
If RV <> TSNE_Const_NoError Then 'Prüfen ob dabei Fehler entstanden sind
Print "[SERVER] [FEHLER] " & TSNE_GetGURUCode(RV) 'Irgend ein Fehler trat beim erstellen des Server auf
MutexDestroy(ClientMutex) 'MUTEX zerstören. Wird jetzt nimmer gebraucht
Print "[END]" 'Wir sind fertig
End 0 'Und beenden das Programm mit dem Returncode: 0
End if
Print "[SERVER] OK!" 'Wenn nicht, dann ausgaben das alle OK war
Print "[SERVER] wait for ESC push..." 'Ausgeben das wir auf ein ESC Tastendruck warten
Do 'Wir poolen die Tastenabfrage
Sleep 10, 1 'Kurz warten um die CPU auslastung massiv zu verringern
Loop until InKey() = Chr(27) 'Prüfen ob ein ESC gedrückt wurde. Wenn ja, dann shcleife verlassen
Print "[SERVER] ESC pushed!" 'Und ausgeben was wir das ESC erkannt haben
Print "[SERVER] Disconnecting..." 'Mitteilen das wir den Server beenden
RV = TSNE_Disconnect(G_Server) 'Server-Socket beenden
If RV <> TSNE_Const_NoError Then Print "[SERVER] [FEHLER] " & TSNE_GetGURUCode(RV) 'Wenn ein Fehler entstand, dann geben wir diesen aus
Print "[SERVER] Wait disconnected..." 'Ausgeben das wir trotzdem auf den Disconnect warten
TSNE_WaitClose(G_Server) 'Wir warten auf das ende der serververbindung
Print "[SERVER] Disconnected!" 'Server wurde beendet
MutexLock(ClientMutex) 'MUTEX sperren um zugriff darauf zu verhinden
Dim TID as UInteger 'Eine Variable erstellen welche die TSNEID zwischenspeichert
For X as UInteger = 1 to ClientC 'Alle clienten im UDT durchgehen
If ClientD(X).V_InUse = 1 Then 'Wird das Element verwendet?
TID = ClientD(X).V_TSNEID 'Wir hohlen die TSNEID der Verbindung udn speichern sie zwischen
MutexUnLock(ClientMutex) 'Da wir jetzt die CLientverbindung trennen wird auch das Disconnect event aufgerufen. Darum Müssen wir das MUTEX entsperren
TSNE_Disconnect(TID) 'Verbindung trennen
MutexLock(ClientMutex) 'MUTEX wieder sperren um nächstes element zu prüfen
End IF
Next
MutexUnLock(ClientMutex) 'Mutex wieder entsperren
MutexDestroy(ClientMutex) 'MUTEX zerstören. Wird jetzt nimmer gebraucht
Print "[END]" 'Wir sind fertig
End 0 'Und beenden das Programm mit dem Returncode: 0
|
Client:
Code: |
'##############################################################################################################
'TEST-CLIENT für TSNE_V3
'##############################################################################################################
'##############################################################################################################
#include once "TSNE_V3.bi" 'Die TCP Netzwerkbibliotek integrieren
'##############################################################################################################
Dim G_Client as UInteger 'Eine Variable für den Client-Handel erstellen
'##############################################################################################################
Sub TSNE_Disconnected(ByVal V_TSNEID as UInteger) 'Empfänger für das Disconnect Signal (Verbindung beendet)
Print "[Disconnected]" 'Wir geben nur kurz aus, das die Verbindung beendet wurde.
End Sub
'##############################################################################################################
Sub TSNE_Connected(ByVal V_TSNEID as UInteger) 'Empfänger für das Connect Signal (Verbindung besteht)
Print "[Connected]" 'Nachdem die Verbindung vollständig aufgebaut wurde, geben wir dies aus, und bereiten das senden der Anfrage vor.
End Sub
'##############################################################################################################
Sub TSNE_NewData(ByVal V_TSNEID as UInteger, ByRef V_Data as String) 'Empfänger für neue Daten
Print "[Data]: >" & V_Data & "<"
End Sub
'##############################################################################################################
Print "[INIT] Client..." 'Programm beginnen
Dim BV as Integer 'Variable für Statusrückgabe erstellen
'Client Verbindung etablieren, Pointer der Empfänger Sub Routinen mit übergeben.
Print "[Connecting]"
BV = TSNE_Create_Client(G_Client, "localhost", 1234, @TSNE_Disconnected, @TSNE_Connected, @TSNE_NewData, 10)
' Statusrückgabe auswerten
If BV <> TSNE_Const_NoError Then
Print "[FEHLER] " & TSNE_GetGURUCode(BV) 'Fehler ausgeben
End -1 'Programmbeenden
End If
Print "[OK]" 'Verbindung wurde erfolgreich hergestellt.
Print "Bitte Daten eingeben! (Mit ENTER absenden, mit ESC beenden)"
Dim T as String
Do
T = InKey()
If T = Chr(27) Then Exit Do
If T <> "" Then TSNE_Data_Send(G_Client, T)
Sleep 10, 1
Loop
Print "[DISCONNECTING] ..." 'Verbindung beenden
TSNE_Disconnect(G_Client)
Print "[END]"
End 'Anschliessend beenden wir unser Programm
|
Im client die IP-Adresse entsprechend anpassen.
dann kannst du mehrmals den client aufrufen, welcher sich mit dem server verbindet.
wenn du dann im clienten eine Taste drückt, überträgt der client diesen buchstabe zum server, und dieser sendet die daten an alle verbundenen clienten weiter (auser dem, welcher das zeichen gesendet hat)
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
|
Nach oben |
|
|
Sveen
Anmeldungsdatum: 31.10.2018 Beiträge: 4
|
Verfasst am: 02.11.2018, 18:52 Titel: |
|
|
oh danke |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 02.11.2018, 21:59 Titel: |
|
|
@Sveen:
Vielen Dank für die Blumen, und es gibt auch sicher Leute, die solch einen Code in einer Stunde runterschreiben könnten, aber ich gehöre definitiv nicht dazu. Den Server / Client habe ich vor ein paar Wochen für einen Thread im englischen Forum geschrieben (oder besser gesagt: Angepasst, die Vorlagen stammen von hier und hier ), aber wenn ich damit einen weiteren Menschen glücklich machen kann: Umso besser.
Aus deiner Beschreibung entnehme ich allerdings, daß du nicht wirklich weißt, was du dir unter den Begriffen "Client" und "Server" vorzustellen hast.
Also: Ein Server ist ein Programm, das darauf wartet, von einem Client kontaktiert zu werden und, sobald das geschieht, dessen Anfrage gemäß seiner Programmierung zu bearbeiten. Ein Server läuft daher üblicherweise permanent im Hintergrund.
Ein Client ist ein Programm, das bei Bedarf Kontakt zu einem Server aufnimmt und eine Anweisung oder Anfrage an diesen schickt. Was dann weiter passiert, hängt wieder von der Programmierung ab. In den allermeisten Fällen wird der Server irgendwelche Daten zum Client zurückschicken, die dieser dann verarbeitet, zwingend notwendig ist das jedoch nicht.
Will ein Server einen anderen Server kontaktieren (Proxy - Server), muß er dazu einen (temporären) Client generieren, der diese Aufgabe erledigt.
Auf keinen Fall kann jedoch ein Server oder Client von sich aus Kontakt zu einem anderen Client aufnehmen.
Vom Autor von TSNE, ThePuppetMaster, gibt es übrigens auch ein Erweiterungsmodul, um Spiele netzwerkfähig zu machen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Sveen
Anmeldungsdatum: 31.10.2018 Beiträge: 4
|
Verfasst am: 02.11.2018, 23:05 Titel: Mehrere Variablen |
|
|
Hallo nochmal
Ich habe jetzt deinen Code verwendet und nach ein bischen "anpassen" hat es dann perfekt funktioniert so wie ich es mir vorgestellt habe. Nach weiteren Tests ist ein neues Problem aufgetaucht . Ich wollte es zuerst selbst herausfinden jedoch bin ich daran gescheitert. Ich kann jetzt zwar eine Variable übertragen jedoch war es das auch. Ich wollte fragen ob mir jemand einen Tipp geben kann wie ich vorgehen könnte um mehrere Variablen auf einenmal zu übertragen z.b X,Y,F etc.
Danke schonmal im voraus
|
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 03.11.2018, 01:16 Titel: |
|
|
@Sveen .. für dein Vorhaben kann ich nur EGNP empfehlen. Es besitzt bereits alle passenden Routinen und Funktionen um derartige Daten zu übertragen und zu verwalten. Zudem lässt es sich sehr sehr einfach erweitern, um es deinen Anforderungen anzupassen.
https://forum.qbasic.at/viewtopic.php?t=8375
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|