1. 程式人生 > >Delphi服務端和PHP客戶端通過Socket通訊

Delphi服務端和PHP客戶端通過Socket通訊

在開始之前看下效果

PHP頁面作為客戶端傳送請求給作為服務端的Delphi應用程式

PHP客戶端頁面開啟如下


Delphi服務端應用程式開啟如下


每次PHP頁面重新整理一下,Delphi的文字框都顯示"我上線啦!"做的很粗糙,但是似乎可以作為某種功能的demo

PHP程式碼如下:

<?php
/***************************服務端*******************************/
///**
// * Created by PhpStorm.
// * User: Administrator
// * Date: 2017/1/2 0002
// * Time: 下午 3:54
// */ // ////確保在連線客戶端時不會超時 //set_time_limit(0); // //$ip = '192.168.1.110'; //$port = 1025; // ///* // 9 +------------------------------- //10 * @socket通訊整個過程 //11 +------------------------------- //12 * @socket_create //13 * @socket_bind //14 * @socket_listen //15 * @socket_accept //16 * @socket_read //17 * @socket_write
//18 * @socket_close //19 +-------------------------------- //20 */ // // /*---------------- 以下操作都是手冊上的 -------------------*/ // if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { // echo "socket_create() 失敗的原因是:".socket_strerror($sock)."\n"; //} // // if(($ret = socket_bind($sock,$ip,$port)) < 0) {
// echo "socket_bind() 失敗的原因是:".socket_strerror($ret)."\n"; // } // // if(($ret = socket_listen($sock,4)) < 0) { // echo "socket_listen() 失敗的原因是:".socket_strerror($ret)."\n"; //} // // $count = 0; // // do { // if (($msgsock = socket_accept($sock)) < 0) { // echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; // break; // } else { // // //發到客戶端 // $msg ="測試成功!\n"; // socket_write($msgsock, $msg, strlen($msg)); // // echo "測試成功了啊\n"; // $buf = socket_read($msgsock,8192); // // // $talkback = "收到的資訊:$buf\n"; // echo $talkback; // // if(++$count >= 5){ // break; // }; // // // } // //echo $buf; // socket_close($msgsock); // // } while (true); // //socket_close($sock); /***************************服務端*******************************/ //?><?php /***************************客戶端*******************************/ //error_reporting(E_ALL); echo "<h2>tcp/ip connection </h2>\n"; $service_port = 1025; $address = '192.168.1.110'; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; } else { echo "OK. \n"; } echo "Attempting to connect to '$address' on port '$service_port'..."; $result = socket_connect($socket, $address, $service_port); if($result === false) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; } else { echo "OK \n"; } $in="我上線啦!"; $a=mb_convert_encoding($in,"GBK","UTF-8"); //$in = "HEAD / http/1.1\r\n"; //$in .= "HOST: localhost \r\n"; //$in .= "Connection: close\r\n\r\n"; //$out = ""; echo "sending http head request ..."; socket_write($socket, $a, strlen($a)); echo "OK\n"; echo "Reading response:\n\n"; while ($out = socket_read($socket, 8192)) { echo $out; } echo "closeing socket.."; socket_close($socket); echo "ok .\n\n"; /***************************客戶端*******************************/
Delphi

設定:

ServerSocket1的Action為True;

ServerSocket1的Port為1025

程式碼 如下:

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ScktComp;


type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    StatusBar1: TStatusBar;
    Button1: TButton;
    Memo1: TMemo;
    Label4: TLabel;
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'connect';
end;


procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  StatusBar1.SimpleText := 'disconnect';
end;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
 Memo1.Lines.Add('悄悄的對你說'+ Socket.ReceiveText);
end;

end.