Entwickler-Ecke
Internet / Netzwerk - ServerSocket/ClientSocket
uspegasus - Di 04.03.03 19:06
Titel: ServerSocket/ClientSocket
Hallo Leute!
Bin ganz neu hier und hoffe das ihr mir vielleicht helfen könnt.
Ich programmiere gerade einen Chat bei den man zwischen zwei Rechnern über das Internet kommunizieren kann.
Auf dem einen Rechner wird das Programm ausgeführt und startet den ServerSocket. Der andere soll über eine Internetseite die ein Java-Applet enthält zum ServerSocket verbinden.
Quelltext
1: 2: 3: 4: 5: 6:
| <applet code="chat.class" width="360" height="350" codebase="http://IP-Adresse:8180"> <param name="Host" value="IP-Adresse"> <param name="port" value="8180"> <param name="nickname" value="tomas"> <param name="sendername" value="uspegasus"> </applet> |
Die chat.class liegt im Ordner des ServerSocket-Programms.
Mein Problem ist das die Verbindung zwar hergestellt wird aber die chat.class auf der Internetseite nicht geladen wird.
Im Memo Feld meines Programmes wird mir dann folgender Text angezeigt:
| Zitat: |
GET /chat.class HTTP/1.1
Accept-Language: de
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: Java 1.1
Host: IP-Adresse:8180
Connection: Keep-Alive |
Benutze ich statt ServerSocket die Indy Kombo IdHTTPServer
und füge dem onCommandGet Ereignis
Quelltext
1:
| IdHTTPServer1.ServeFile(AThread, AResponseInfo, ExtractFilePath(Application.ExeName) + 'chat.class'); |
hinzu wird die chat.class einwandfrei auf der Internetseite geladen aber
leider schaffe ich es nicht mit der Indy Kombo IdHTTPServer1 die Daten auszutauschen! Sie besitzt kein onClientRead oder onClientWrite Ereigniss und trennt die Verbindung auch wieder sofort??
Meine Frage ist:
Gibt es für ServerSocket etwas ähnliches wie bei IdHTTPServer
Quelltext
1:
| ""IdHTTPServer1.ServeFile(AThread, AResponseInfo, ExtractFilePath(Application.ExeName) + 'chat.class');"" |
mit dem man auf die chat.class zugreifen kann?
Würde mich freuen wenn ihr mir helfen könntet.
Gruss uspegasus
Moderiert von
Klabautermann: Code- & Quote- Tags hizugefügt.
M4EiB - Di 04.03.03 20:54
die Antwort lautet: nein
Der Browser, mit dem deine Internetseite aufgerufen wurde, kommuniziert auf der Basis des HTTP-Protokolls (mehr dazu kannst du
hier [
ftp://ftp.rfc-editor.org/in-notes/rfc1945.txt] und
hier [
ftp://ftp.rfc-editor.org/in-notes/rfc2068.txt] erfahren), darum der Text im Memo. Er verlangt demnach auch eine entsprechende Antwort. Die HTTP-Server Komponente von Indy mache das automatisch. Wenn du einfach die Datei schickst reicht das nicht.
Und zwar mußt du erst einen Header schicken, bevor du die Datei schickst. Probier es mal so:
die Zeilen müssen mit einem Zielenumbruch(#13#10) abgeschloßen werden
Quelltext
1: 2: 3: 4:
| HTTP/1.1 200 OK Content-Length: xxx <----------- die Größe der chat.class <----------- hier MUSS eine leere zeile sein ab hier die Datei |
entweder machst du erst 3 mal writeln und dann writebuffer (oder wie der Befehl auch immer heißt) oder du bereitest erst alles in einem Buffer vor und schickst diesen dann.
M4EiB
uspegasus - Di 04.03.03 23:08
Hallo M4EiB,
erstmal vielen Dank für die schnelle Hilfe.
Ich habe mir so etwas in der Art schon gedacht wusste aber nicht genau wie ich das umsetzen kann.
Ich habe es mal so probiert:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm2.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket); var Buf: TMemoryStream; begin Buf := TMemoryStream.Create; Buf.LoadFromFile(ExtractFilePath(Application.ExeName) + 'chat.class'); ServerSocket1.Socket.Connections[0].SendText('HTTP/1.1 200 OK'#13#10'Content-Length: 4142'#13#10''#13#10); ServerSocket1.Socket.Connections[0].SendBuf(Buf, 4142); end;
procedure TForm2.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add(Socket.ReceiveText); end; |
leider klappt das auch nicht?? Bei dieser Variante kommt "load: chat.class not found" auf der Internetseite?? Er findet die chat.class also nicht??
Wenn ich es einzeln mit SendText sende versucht der Browser ständig zu laden und der selbe Text in der Memo:
GET /chat.class HTTP/1.1
Accept-Language: de
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: Java 1.1
Host: IP-Adresse:8180
Connection: Keep-Alive
Was mache ich nur falsch? Ich versuche jetzt schon seit 2 Wochen das hinzubekommen und werde langsam verrückt.
Vielleicht hast du ja noch eine Idee. Würde mich riesig darüber freuen
wenn mir jemand helfen kann.
Wäre auch gern bereit dafür zu bezahlen wenn mir jemand hierbei hilft!
Gruss uspegasus
Moderiert von
Tino: Code-Tags hinzugefügt.
M4EiB - Mi 05.03.03 00:12
ich kann dir nur eine Lösung für den Indy TCP-Server anbieten:
sollte aber funktionieren.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var Buf: Tfilestream; begin Buf := Tfilestream.Create(ExtractFilePath(Application.ExeName) + 'chat.class',fmopenread); athread.Connection.WriteLn('HTTP/1.1 200 OK'); athread.Connection.WriteLn('Content-Length: '+inttostr(buf.Size)); athread.Connection.WriteLn(''); athread.Connection.WriteStream(buf,true); athread.Connection.Disconnect; buf.Free; end; |
uspegasus - Mi 05.03.03 16:54
Titel: So geht es!
Hallo M4EiB,
So funzt es :lol:
Nochmals vielen Dank für deine Hilfe!
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm2.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket); var Buf: TfileStream; begin Buf := Tfilestream.Create(ExtractFilePath(Application.ExeName) + 'sexanjachat.class',fmopenread); ServerSocket1.Socket.Connections[0].SendText('HTTP/1.1 200 OK'#13#10'Content-Length:' +inttostr(buf.Size)+#13#10''#13#10); ServerSocket1.Socket.Connections[0].SendStream(Buf); end; |
Wenn ich jetzt aber mit:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm2.Button1Click(Sender: TObject); begin MSText := Edit1.Text; Memo1.Text := Edit1.Text; ServerSocket1.Socket.Connections[0].SendText(MSText); Edit1.Text := ''; end; |
einen Text sende kommt dieser im Internetbrowser nicht an??
Muss ich hier auch das HTML Protocoll vorher senden?
Ich habe es auch schon mit dem IdTCPServer versucht aber das Problem ist das dieser auch keine onClientRead und onClientWrite Ereignisse besitzt! Habe zusätzlich noch IdLogEvent benutzt aber irgendwie bekomme ich das nicht zum laufen? Mache da noch irgendwas falsch!
Gruss uspegasus
Moderiert von
Tino: Code-Tags hinzugefügt.
M4EiB - Mi 05.03.03 17:29
Von wem ist die Verbindung, mit der du senden willst? Noch die gleiche wie die oben drüber? Eine neue mit dem Browser? Oder eine vom Applet?
uspegasus - Mi 05.03.03 19:06
Titel: Verbindung?
Die Verbindung ist noch die gleiche wie oben.
Also das senden vom Applet zum Server geht und der Text kommt auch an und wird in der Memo angezeigt.
Wenn ich aber einen Text an das Applet(Client) schicken will kommt dieser nicht an und wird im Apllet nicht angezeigt?
Mit
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm2.Button1Click(Sender: TObject); var SText: String; begin SText := Edit1.Text; Memo1.Lines.Add(login+': '+Edit1.Text); ServerSocket1.Socket.Connections[0].SendText('HTTP/1.1 200 OK'#13#10''#13#10 +SText); Edit1.Text := ''; end; |
will ich an alle verbundenen Clients den Text schicken.
Muss ich jedesmal vorher die Verbindung disconnecten????
Du hattest in deinem Beispiel
aThread.connection.disconnect ???
Das wollte ich eigentlich nicht sondern die Verbindung soll so lange aufrecht erhalten werden bis der Client das Applet wieder schliesst.
Ich bekomme auch nach ca 1 Minute eine ASynchron Exception ??
Vielleicht weisst du ja woran es liegen kann.
Gruss uspegasus
Moderiert von
Klabautermann: Code-Tags hinzugefügt.
M4EiB - Mi 05.03.03 21:48
Von Java-Applet Programmierung habe ich keine Ahnung, darum kann ich dir nicht sagen wie man etwas an das Appplet schickt.
Soweit ich noch weiß ist Connections von TServerSocket.Socket das Array mit allen Verbindungen. Wenn du nur an Connections[0] schickst, schickst du nur an eine Verbindung. Du mßt also das ganze in einer Schleife laufen lassen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!