Autor Beitrag
uspegasus
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 04.03.03 19:06 
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.

ausblenden 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

ausblenden 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

ausblenden 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 user profile iconKlabautermann:  Code- & Quote- Tags hizugefügt.
M4EiB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: 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 und hier 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
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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:
ausblenden 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 user profile iconTino: Code-Tags hinzugefügt.
M4EiB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mi 05.03.03 00:12 
ich kann dir nur eine Lösung für den Indy TCP-Server anbieten:
sollte aber funktionieren.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 05.03.03 16:54 
Titel: So geht es!
Hallo M4EiB,

So funzt es :lol:

Nochmals vielen Dank für deine Hilfe!
ausblenden 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:
ausblenden 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 user profile iconTino: Code-Tags hinzugefügt.
M4EiB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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

ausblenden 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 user profile iconKlabautermann: Code-Tags hinzugefügt.
M4EiB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: 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.