2015-10-04 60 views
4

我想在使用突觸的lazarus中創建https服務器,但我失敗了。我想讓mys服務器從其他https客戶端接收數據。 我使用https://localhost:1500和我的瀏覽器發送請求,並且mys服務器正在接收信號。但是當我嘗試讀取發送的數據時,我什麼也收不到。當我測試簡單的http服務器都工作正常。但現在在https的情況下,它不工作。我使用的Ubuntu 15.04作爲我的操作系統如何在lazarus中使用突觸創建https服務器

s:= ASocket.RecvString(timeout); //返回noething

我的示例代碼:

unit Unit1; 

{$mode objfpc}{$H+} 

interface 

uses 
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; 

type 

    { TForm1 } 

    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { private declarations } 
    public 
    { public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.lfm} 

uses 
    blcksock, sockets, Synautil, ssl_openssl, ssl_openssl_lib; 

procedure AttendConnection(ASocket: TTCPBlockSocket); 
var 
    timeout: integer; 
    s: string; 
    method, uri, protocol: string; 
    OutputDataString: string; 
    ResultCode: integer; 
begin 
    timeout := 1000; 

    WriteLn('Received headers+document from browser:'); 

    //read request line 
    s := ASocket.RecvString(timeout); 
    WriteLn(s); 
    method := fetch(s, ' '); 
    uri := fetch(s, ' '); 
    protocol := fetch(s, ' '); 

    //read request headers 
    repeat 
    s := ASocket.RecvString(Timeout); 
    WriteLn(s); 
    until s = ''; 

    // Now write the document to the output stream 

    if uri = '/' then 
    begin 
    // Write the output document to the stream 
    OutputDataString := 
     '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' 
     + ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' + CRLF 
     + '<html><h1>Teste</h1></html>' + CRLF; 

    // Write the headers back to the client 
    ASocket.SendString('HTTP/1.0 200' + CRLF); 
    ASocket.SendString('Content-type: Text/Html' + CRLF); 
    ASocket.SendString('Content-length: ' + IntTostr(Length(OutputDataString)) + CRLF); 
    ASocket.SendString('Connection: close' + CRLF); 
    ASocket.SendString('Date: ' + Rfc822DateTime(now) + CRLF); 
    ASocket.SendString('Server: Servidor do Felipe usando Synapse' + CRLF); 
    ASocket.SendString('' + CRLF); 

    // if ASocket.lasterror <> 0 then HandleError; 

    // Write the document back to the browser 
    ASocket.SendString(OutputDataString); 
    end 
    else 
    ASocket.SendString('HTTP/1.0 404' + CRLF); 
end; 

{ TForm1 } 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ListenerSocket, ConnectionSocket: TTCPBlockSocket; 
begin 
    ListenerSocket := TTCPBlockSocket.Create; 
    ConnectionSocket := TTCPBlockSocket.Create; 

    ListenerSocket.CreateSocket; 
    ListenerSocket.SSL.CertificateFile := '/home/imants/projects/apps/medieval/bin/40669199_localhost_8080.cert'; 
    ListenerSocket.SSL.PrivateKeyFile := '/home/imants/projects/apps/medieval/bin/40669199_localhost_8080.key'; 
    ListenerSocket.SSLDoConnect; 
    ListenerSocket.setLinger(true,10); 
    ListenerSocket.bind('localhost','1500'); 
    ListenerSocket.listen; 

    repeat 
    if ListenerSocket.canread(1000) then 
    begin 
     ConnectionSocket.Socket := ListenerSocket.accept; 
     WriteLn('Attending Connection. Error code (0=Success): ', ConnectionSocket.lasterror); 
     AttendConnection(ConnectionSocket); 
     ConnectionSocket.CloseSocket; 
    end; 
    until false; 

    ListenerSocket.Free; 
    ConnectionSocket.Free; 
end; 

end. 
+0

您是否遵循(或查找)了http://www.ararat.cz/synapse/doku.php/public:howto:httpsserver上的說明? – Rik

+0

不,我發現那個例子,我會嘗試檢查HTTP服務器演示(這是我猜與突觸),並會嘗試相應地改變它。 –

+0

不幸的是,http服務器示例女巫自帶突觸是Windows特定的,因爲它使用了winsock單位女巫拉撒路至少在Linux中不支持 –

回答

3

有兩個來源,我知道,有一個Synapse中的HTTP(s)服務器的例子。

第一個示例是Synapse stable package (release 40)。儘管我建議您使用SVN version(您可以使用該頁面上的Download Snapshot按鈕),但仍然可以使用「release 40軟件包」中的示例。

synapse40\source\demo\httpsserv中的示例應該可用作HTTPS服務器。如果不是,你可以採用httpserv(HTTP)示例並將其更改爲shown here。 (但我認爲httpsserv與這些修改是一樣的)

如果您在Linux(Lazarus)上,則需要將每次出現的winsock更改爲synsock並刪除任何windows條款。

另一個例子可以是found here。 (Direct download of SynHttp.zip)據我所見,它也具有HTTPS服務器功能。

2

我知道你想使用突觸,但你可能想看看在印第安納波利斯。多年來,我一直在用indy開發服務器/客戶端應用程序,我喜歡它。它與Windows和Linux(32位,64位,手臂......)工作正常,並有一些不錯的功能。您可以使用TIdHTTPServer組件。另外得到一個IOHandlerSSLOpenSSL。事件OnCommandGet(AContext:TIdContext; ARequestInfo:TIdHTTPRequestInfo; AResponseInfo:TIdHTTPResponseInfo)是最重要的一個。它允許訪問請求(如A ARequestInfo.Document)和HTTP響應(AResponseInfo)。

+0

我使用indy,它工作的爐排。但是它有一些與Lazarus有關的不好的問題,就像我的自動構建服務器由於Lazarus中的一些錯誤或者它們是封裝而無法100%編譯它。當編譯它拋出無法找到IdStreamVCL :(所以我現在嘗試使用一些其他方法。但如果我不會找到什麼,那麼是的Indy它是。 –

+1

爲Lazarus安裝Indy是一團糟,但您不需要:)您可以將indy文件夾複製到您的項目文件夾中。在Lazarus中按Shift + Ctrl + F11並選擇編譯器選項 - >路徑。將您的Indy源文件夾(Indy \ source)添加到其他單元文件並完成:)只需添加您所需的單元並在運行時創建組件。 –

+0

你的建議幫助我解決了indy的問題。這不是我想要的最好的解決方案,它比它更好。但是,這並沒有回答我原來的問題,我不會接受這個答案。 –

相關問題