2015-10-04 74 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的问题。这不是我想要的最好的解决方案,它比它更好。但是,这并没有回答我原来的问题,我不会接受这个答案。 –