Delphi TclientSocket和TserverSocket用法(1)

Delphi,网络通信,TserverSocket,TclientSocket


现在将本人总结出来的TServerSocket和TClientSocket两个组件的基本用法写出来,希望与您分享。

ClientSocket组件为客户端组件。它是通信的请求方,也就是说,它是主动地与服务器端建立连接。

ServerSocket组件为服务器端组件。它是通信的响应方,也就是说,它的动作是监听以及被动接受客户端的连接请
求,并对请求进行回复。

ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的
连接,进行单独的通信。因此,一个服务器端可以为多个客户端服务


设计思路
本例包括一个服务器端程序和一个客户端程序。客户端程序可以放到多个计算机上运行,同时与服务器端进行连接
通信。
本例的重点,
一是演示客户端与服务器端如何通信;
二是当有多个客户端同时连接到服务器端时,服务器端如何识别每个客户端,并对请求给出相应的回复。为了保证一个客户端断开连接时不影响其它客户端与服务器端的通信,
同时保证服务器端能够正确回复客户端的请求,在本例中声明了一个记录类型:
type
client_record=record
CHandle: integer; //客户端套接字句柄
CSocket:TCustomWinSocket; //客户端套接字
CName:string; //客户端计算机名称
CAddress:string; //客户端计算机IP地址
CUsed: boolean; //客户端联机标志
end;
利用这个记录类型数据保存客户端的信息,同时保存当前客户端的连接状态。其中,
CHandle保存客户端套接字句柄,以便准确定位每个与服务器端保持连接的客户端;
Csocket保存客户端套接字,通过它可以对客户端进行回复。
Cused记录当前客户端是否与服务器端保持连接。

下面对组件ServerSocket和ClientSocket的属性设置简单说明。

ServerSocket的属性:

· Port,是通信的端口,必须设置。在本例中设置为1025

· ServerTypt,服务器端读写信息类型,设置为stNonBlocking表示异步读写信息,本例中采用这种方式。

· ThreadCacheSize,客户端的最大连接数,就是服务器端最多允许多少客户端同时连接。本例采用默认值10。

其它属性采用默认设置即可。

ClientSocket的属性:

· Port,是通信的端口,必须与服务器端的设置相同。在本例中设置为1025;

· ClientType,客户端读写信息类型,应该与服务器端的设置相同,为stNonBlocking表示异步读写信息。

· Host,客户端要连接的服务器的IP地址。必须设置,当然也可以在代码中动态设置。

其它属性采用默认设置即可。

程序源代码:

· 服务器端源码(uServerMain.pas):

<span style="font-size:18px;">unit uServerMain;  
interface  
uses  
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
ScktComp, ToolWin, ComCtrls, ExtCtrls, StdCtrls, Buttons;  
const  
CMax=10; //客户端最大连接数  
type  
client_record=record  
CHandle: integer; //客户端套接字句柄  
CSocket:TCustomWinSocket; //客户端套接字  
CName:string; //客户端计算机名称  
CAddress:string; //客户端计算机IP地址  
CUsed: boolean; //客户端联机标志  
end;  
type  
TfrmServerMain = class(TForm)  
ServerSocket: TServerSocket;  
ControlBar1: TControlBar;  
ToolBar1: TToolBar;  
tbConnect: TToolButton;  
tbClose: TToolButton;  
tbDisconnected: TToolButton;  
Edit1: TEdit;  
Memo1: TMemo;  
StatusBar: TStatusBar;  
procedure tbConnectClick(Sender: TObject);  
procedure tbDisconnectedClick(Sender: TObject);  
procedure ServerSocketClientRead(Sender: TObject;  
Socket: TCustomWinSocket);  
procedure ServerSocketListen(Sender: TObject;  
Socket: TCustomWinSocket);  
procedure ServerSocketClientConnect(Sender: TObject;  
Socket: TCustomWinSocket);  
procedure ServerSocketClientDisconnect(Sender: TObject;  
Socket: TCustomWinSocket);  
procedure tbCloseClick(Sender: TObject);  
procedure FormCreate(Sender: TObject);  
procedure FormClose(Sender: TObject; var Action: TCloseAction);  
procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;  
var ClientSocket: TServerClientWinSocket);  
procedure ServerSocketClientError(Sender: TObject;  
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;  
var ErrorCode: Integer);  
private  
{ Private declarations }  
public  
{ Public declarations }  
session: array[0..CMax] of client_record; //客户端连接数组  
Sessions: integer; //客户端连接数  
end;  
var  
frmServerMain: TfrmServerMain;  
implementation  
{$R *.DFM}  
//打开套接字连接,并使套接字进入监听状态  
procedure TfrmServerMain.tbConnectClick(Sender: TObject);  
begin  
ServerSocket.Open ;  
end;  
//关闭套接字连接,不再监听客户端的请求  
procedure TfrmServerMain.tbDisconnectedClick(Sender: TObject);  
begin  
ServerSocket.Close;  
StatusBar.Panels[0].Text :=服务器套接字连接已经关闭,无法接受客户端的连接请求.;  
end;  
//从客户端读取信息  
procedure TfrmServerMain.ServerSocketClientRead(Sender: TObject;  
Socket: TCustomWinSocket);  
var  
i:integer;  
begin  
//将从客户端读取的信息添加到Memo1中  
Memo1.Lines.Add(Socket.ReceiveText);  
for i:=0 to sessions do  
begin  
//取得匹配的客户端  
if session[i].CHandle = Socket.SocketHandle then  
begin  
session[i].CSocket.SendText(回复客户端+session[i].CAddress+ ==> +Edit1.Text);  
end;  
end;  
end;  
//服务器端套接字进入监听状态,以便监听客户端的连接  
procedure TfrmServerMain.ServerSocketListen(Sender: TObject;  
Socket: TCustomWinSocket);  
begin  
StatusBar.Panels[0].Text :=等待客户端连接...;  
end;  
//当客户端连接到服务器端以后  
procedure TfrmServerMain.ServerSocketClientConnect(Sender: TObject;  
Socket: TCustomWinSocket);  
var  
i,j:integer;  
begin  
j:=-1;  
for i:=0 to sessions do  
begin  
//在原有的客户端连接数组中有中断的客户端连接  
if not session[i].CUsed then  
begin  
session[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄  
session[i].CSocket := Socket; //客户端套接字  
session[i].CName := Socket.RemoteHost ; //客户端计算机名称  
session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IP  
session[i].CUsed := True; //连接数组当前位置已经占用  
Break;  
end;  
j:=i;  
end;  
if j=sessions then  
begin  
inc(sessions);  
session[j].CHandle := Socket.SocketHandle ;  
session[j].CSocket := Socket;  
session[j].CName := Socket.RemoteHost ;  
session[j].CAddress := Socket.RemoteAddress ;  
session[j].CUsed := True;  
end;  
StatusBar.Panels[0].Text := 客户端 +Socket.RemoteHost + 已经连接;  
end;  
//当客户端断开连接时  
procedure TfrmServerMain.ServerSocketClientDisconnect(Sender: TObject;  
Socket: TCustomWinSocket);  
var  
i:integer;  
begin  
for i:=0 to sessions do  
begin  
if session[i].CHandle =Socket.SocketHandle then  
begin  
session[i].CHandle :=0;  
session[i].CUsed := False;  
Break;  
end;  
end;  
StatusBar.Panels[0].Text :=客户端 +Socket.RemoteHost + 已经断开;  
end;  
//关闭窗口  
procedure TfrmServerMain.tbCloseClick(Sender: TObject);  
begin  
Close;  
end;  
procedure TfrmServerMain.FormCreate(Sender: TObject);  
begin  
sessions := 0;  
end;  
procedure TfrmServerMain.FormClose(Sender: TObject;  
var Action: TCloseAction);  
begin  
ServerSocket.Close ;  
end;  
//当客户端正在与服务器端连接时  
procedure TfrmServerMain.ServerSocketGetSocket(Sender: TObject;  
Socket: Integer; var ClientSocket: TServerClientWinSocket);  
begin  
StatusBar.Panels[0].Text :=客户端正在连接...;  
end;  
//客户端发生错误  
procedure TfrmServerMain.ServerSocketClientError(Sender: TObject;  
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;  
var ErrorCode: Integer);  
begin  
StatusBar.Panels[0].Text :=客户端+Socket.RemoteHost +发生错误!;  
ErrorCode := 0;  
end;  
end.</span> 


· 客户端源码(uClientMain.pas):


<span style="font-size:12px;color:#000000;"><span style="font-size:18px;">unit uClientMain;  
interface  
uses  
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
ScktComp, ComCtrls, ToolWin, ExtCtrls, StdCtrls, Buttons;  
const  
SocketHost = 172.16.1.6; //服务器端地址  
type  
TfrmClientMain = class(TForm)  
ControlBar1: TControlBar;  
ToolBar1: TToolBar;  
tbConnected: TToolButton;  
tbSend: TToolButton;  
tbClose: TToolButton;  
tbDisconnected: TToolButton;  
ClientSocket: TClientSocket;  
Edit1: TEdit;  
Memo1: TMemo;  
StatusBar: TStatusBar;  
btnSend: TBitBtn;  
procedure tbConnectedClick(Sender: TObject);  
procedure tbDisconnectedClick(Sender: TObject);  
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);  
procedure tbSendClick(Sender: TObject);  
procedure tbCloseClick(Sender: TObject);  
procedure FormShow(Sender: TObject);  
procedure ClientSocketConnect(Sender: TObject;  
Socket: TCustomWinSocket);  
procedure ClientSocketConnecting(Sender: TObject;  
Socket: TCustomWinSocket);  
procedure ClientSocketDisconnect(Sender: TObject;  
Socket: TCustomWinSocket);  
procedure FormClose(Sender: TObject; var Action: TCloseAction);  
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;  
ErrorEvent: TErrorEvent; var ErrorCode: Integer);  
private  
{ Private declarations }  
public  
{ Public declarations }  
end;  
var  
frmClientMain: TfrmClientMain;  
implementation  
{$R *.DFM}  
//打开套接字连接  
procedure TfrmClientMain.tbConnectedClick(Sender: TObject);  
begin  
ClientSocket.Open ;  
end;  
//关闭套接字连接  
procedure TfrmClientMain.tbDisconnectedClick(Sender: TObject);  
begin  
ClientSocket.Close;  
end;  
//接受服务器端的回复  
procedure TfrmClientMain.ClientSocketRead(Sender: TObject;  
Socket: TCustomWinSocket);  
begin  
Memo1.Lines.Add(Socket.ReceiveText);  
end;  
//发送信息到服务器端  
procedure TfrmClientMain.tbSendClick(Sender: TObject);  
begin  
ClientSocket.Socket.SendText(Edit1.Text);   
end;  
procedure TfrmClientMain.tbCloseClick(Sender: TObject);  
begin  
Close;  
end;  
//设置要连接的服务器端地址  
procedure TfrmClientMain.FormShow(Sender: TObject);  
begin  
ClientSocket.Host := SocketHost;  
end;  
//已经连接到服务器端  
procedure TfrmClientMain.ClientSocketConnect(Sender: TObject;  
Socket: TCustomWinSocket);  
begin  
tbSend.Enabled := True;  
tbDisconnected.Enabled :=True;  
btnSend.Enabled := True;  
StatusBar.Panels[0].Text := 已经连接到 + Socket.RemoteHost ;  
end;  
//正在连接到服务器端  
procedure TfrmClientMain.ClientSocketConnecting(Sender: TObject;  
Socket: TCustomWinSocket);  
begin  
StatusBar.Panels[0].Text := 正在连接到服务器... ;  
end;  
//当断开与服务器端的连接时发生  
procedure TfrmClientMain.ClientSocketDisconnect(Sender: TObject;  
Socket: TCustomWinSocket);  
begin  
tbSend.Enabled := False;  
btnSend.Enabled := False;  
tbDisconnected.Enabled := False;  
StatusBar.Panels[0].Text := 已经断开与 + Socket.RemoteHost + 的连接;  
end;  
procedure TfrmClientMain.FormClose(Sender: TObject;  
var Action: TCloseAction);  
begin  
ClientSocket.Close ;  
end;  
//当与服务器端的连接发生错误时  
procedure TfrmClientMain.ClientSocketError(Sender: TObject;  
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;  
var ErrorCode: Integer);  
begin  
StatusBar.Panels[0].Text := 与服务器端的连接发生错误;  
ErrorCode := 0;  
end;  
end.   </span>
小结

上述方法是比较简单的实现方法,同时也是相对较容易理解的方法。

通过这个方法,笔者成功实现了局域网内多个
客户端与服务器端进行Socket通信的功能,同时可以保证一个客户端的连接、通信或是断开都不影响其它客户端的
正常通信。


  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi 深度编程及其项目应用开发》 作 者: 李存斌 汪兵 编著 丛书名: 万水软件项目应用与实例开发丛书 出版社: 中国水利水电出版社 出 版: 2002-9----------简 介 本书是在总结作者多年Delphi开发经验的基础上编著而成。 全书分为基础篇和应用篇。基础篇结合示例论述了Delphi的深度编程技术,其中包括9章,分别为:理解Windows消息、进程与线程、自定义组件的编写、文件操作、创建DLL应用程序、两层数据库应用程序、多层数据库应用程序、Socket编程、串口编程;应用篇结合物资管理信息系统项目应用开发技术和经验,详细阐述了一般管理信息系统软件通用模块的开发,其中包括10章,分别为:物资管理信息系统概述及其总体框架设计、物资管理信息系统后台数据库设计、应用服务器的实现、客户端应用程序的设计、动态连接应用服务器的实现、通用权限管理模块的设计、通用查询组件和报表模块的制作、通用基础数据维护模块的设计、物资管理信息系统业务操作模块的设计、综合查询模块的设计。读者在具有一定Delphi知识的基础上,通过本书的学习,可快速提高Delphi的编程能力和实际开发水平。 本书适用于具有初步编程能力的读者,也可作为高校高年级学生毕业设计的指导书。中国水利水电出版社网站(www.waterpub.com.cn)上包括了书中示例和较为完整的物资管理信息系统的源代码文件,为读者的学习提供方便,同时也为相关软件开发人员的实际应用开发提供捷径和参考。 ----------目 录 丛书前言 前言 基础篇:Delphi深度编程技术 第1章 理解Windows消息 1.1 消息概述 1.2 Windows消息工作机理 1.3 Delphi的VCL消息系统处理原理 1.4 发送消息 1.4.1 Perform() 1.4.2 SendMessage()和PostNessage() 1.4.3 消息的发送 1.5 消息处理 1.6 消息过滤 第2章 进程与线程 2.1 进程与线程 2.1.1 进程概述 2.1.2 进程的直接创建 2.1.3 列举系统打开的进程 2.1.4 线程概述 2.2 进程间通讯(IPC) 2.2.1 利用WM_COPYDATA消息实现进程间通讯 2.2.2 利用内存映射文件实现进程间通讯 2.3 TThread对象 2.3.1 线程的创建 2.3.2 线程的挂起和恢复 2.3.3 线程的终止 2.3.4 与VCL同步 2.4 线程同步 2.4.1 临界区(CriticalSection) 2.4.2 互斥(Mutex) 2.4.3 信号量(Semaphore) 2.5 进程的优先级别 2.5.1 进程的优先级类 2.5.2 相对优先级 2.6 后台多线程数据查询实例 第3章 自定义组件的编写 3.1 组件的基本概念 3.1.1 属性 3.1.2 方法 3.1.3 事件 3.1.4 拥有关系 3.1.5 父子关系 3.2 组件创建实例 3.3 组件的高级技术--属性编辑器和组件编辑器 3.3.1 组件的属性编辑器 3.3.2 组件的组件编辑器 3.3.3 带有属性编辑器和组件编辑器的自定义组件实例 3.4 创建对话框组件 第4章 文件操作 4.1 文件的基本操作 4.1.1 文本文件 4.1.2 有类型文件 4.1.3 INI文件 4.1.4 无类型文件 4.1.5 文件的复制 4.2 内存映射文件 4.2.1 内存映射文件的应甩 4.2.2 映射文件的使用 4.3 内存映射文件的应用 第5章 创建DLL应用程序 5.1 DLL概述 5.2 DLL的创建 5.2.1 DLL项目文件 5.2.2 Exports关键字的使用 5.2.3 DLL中的变量 5.2.4 DLL实例:动态DLL中的窗体 5.3 DLL的调用 5.3.1 静态调用 5.3.2 动态调用 5.4 DLL的入口函数和出口函数 5.4.1 进程/线程的初始化和例程的终止 5.4.2 DLL入口/出口示例 5.5 利用DLL创建插件程序 5.5.1 插件程序的设计思想 5.5.2 插件应用程序的创建 5.5.3 创建调用插件程序的主程序 第6章 两层数据库应用程序 6.1 关系型数据库 6.1.1 关系型数据库概述 6.1.2 结构化查询语言(SQL) 6.2 数据库的连接 6.2.1 基于BDE的数据库连接 6.2.2 基于0DBC的数据库连接 6.2.3 基于AD0的数据库连接技术 6.3 TSession元件 6.4 1 DahBase组件 6.4.1 TDataBase组件的使用 6.4.2 用配置文件动态设置BDE 6.5 数据访问组件 6.5.1 TTable组件 6.5.2 TQuery组件 6.5.3 TStoredProc过程 6.6 数据感知组件 6.7 事务 第7章 多层数据库应用程序 7.1 一个简单的多层应用系统 7.1.1 服务器端应用程序的建立 7.1.2 客户端应用程序的建立 7.2 多层应用系统处理数据的原理 7.2.1 多层应用系统的结构 7.2.2 存取数据的运作原理 7.2.3 更新数据的运作原理 7.3 容错处理和负载平衡 7.4 Active Form 第8章 Socket编程 8.1 WinSock基础 8.1.1 TCP、UDP和IP协议 8.1.2 套接字(Socket) 8.1.3 客户/服务器模式 8.1.4 面向连接的协议套接字的调用 8.1.5 面向无连接协议的套接字的调用 8.2 利用Winsock API实现Socket编程 8.2.1 常用WinSockAPI函数 8.2.2 利用WinSockAPI实现Socket编程 8.3 利用组件实现Socket编程 8.3.1 TClientSocket组件 8.3.2 TServerSocket组件 8.3.3 远程抓屏示例 8.4 通讯中间件的制作 8.4.1 磁盘队列的实现 8.4.2 客户端和服务器端发送接收磁盘队列数据的套接字的建立 8.4.3 中间件的简单应用 第9章 串口编程 9.1 串口通信的基础知识 9.1.1 同步通信和异步通信 9.1.2 波特率和数据传输率 9.2 串口通信API 9.2.1 DCB数据结构 9.2.2 与串口通信相关的函数 9.3 利用API函数创建串口通信示例 9.3.1 发送数据部分设计(向串口写数据) 9.3.2 数据部分设计(从串口读数据) 9.3.3 程序的具体设计和实现 9.4 利用SPC0MM组件实现串口通信编程 9.4.1 SPCOMM组件的安装 9.4.2 SPCOMM组件的属性、方法和事件 9.4.3 利用SPCOMM通讯组件实现串口通讯的实例 应用篇:物资管理信息系统项目应用开发 第10章 物资管理信息系统概述及其总体框架设计 10.1 系统总体结构设计 10.2 物资管理信息系统需求定义和业务流程图 10.2.1 仓储管理 10.2.2 计划管理 10.2.3 合同管理 10.2.4 物资管理系统的业务流程 第11章 物资管理信息系统后台数据库设计 11.1 关系型数据库概述 11.1.1 关系型数据库 11.1.2 物资管理信息系统数据库的建立 11.2 物资管理信息系统数据结构的设计 11.2.1 权限管理数据结构的设计 11.2.2 仓储管理数据结构的设计 11.2.3 计划管理数据结构的设计 11.2.4 合同管理数据结构的设计 11.2.5 基础设置数据结构的设计 第12章 应用服务器的实现 12.1 创建应用服务器的实例 12.2 状态区编程 12.3 动态数据库的连接 12.4 远程数据模块的建立 第13章 客户端应用程序的设计 13.1 客户端应用程序系统流程和系统功能 13.1.1 系统流程 13.1.2 系统功能 13.2 构建客户端应用程序框架 第14章 动态连接应用服务器的实现 第15章 通用权限管理模块的设计 15.1 系统登录的设计 15.2 权限设计表中数据的维护 第16章 通用查询和报表组件的制作 16.1 通用查询组件的创建 16.2 通用报表模块的制作 第17章 通用基础数据维护模块的设计 17.1 界面设计 17.2 代码实现 17.2.1 以目录树的格式显示部门档案数据 17.2.2 利用目录树导航数据 17.2.3 利用目录树操作数据 17.2.4 按表格的标题排序 17.2.5 打印部门档案 第18章 物资管理信息系统业务操作模块的设计 18.1 数据表的设置 18.2 收料单据主表显示区 18.3 具体的材料明细表显示区 18.4 数据操作区 第19章 综台查询模块的设计 19.1 数据源的设置 19.2 窗体样式设计 19.3 代码实现 19.3.1 查询数据 19.3.2 打印数据 19.3.3 全部浏览----------
基础篇:Delphi深度编程技术 第1章 理解Windows消息 1.1 消息概述 1.2 Windows消息工作机理 1.3 Delphi的VCL消息系统处理原理 1.4 发送消息 1.4.1 Perform() 1.4.2 SendMessage()和PostNessage() 1.4.3 消息的发送 1.5 消息处理 1.6 消息过滤 第2章 进程与线程 2.1 进程与线程 2.1.1 进程概述 2.1.2 进程的直接创建 2.1.3 列举系统打开的进程 2.1.4 线程概述 2.2 进程间通讯(IPC) 2.2.1 利用WM_COPYDATA消息实现进程间通讯 2.2.2 利用内存映射文件实现进程间通讯 2.3 TThread对象 2.3.1 线程的创建 2.3.2 线程的挂起和恢复 2.3.3 线程的终止 2.3.4 与VCL同步 2.4 线程同步 2.4.1 临界区(CriticalSection) 2.4.2 互斥(Mutex) 2.4.3 信号量(Semaphore) 2.5 进程的优先级别 2.5.1 进程的优先级类 2.5.2 相对优先级 2.6 后台多线程数据查询实例 第3章 自定义组件的编写 3.1 组件的基本概念 3.1.1 属性 3.1.2 方法 3.1.3 事件 3.1.4 拥有关系 3.1.5 父子关系 3.2 组件创建实例 3.3 组件的高级技术--属性编辑器和组件编辑器 3.3.1 组件的属性编辑器 3.3.2 组件的组件编辑器 3.3.3 带有属性编辑器和组件编辑器的自定义组件实例 3.4 创建对话框组件 第4章 文件操作 4.1 文件的基本操作 4.1.1 文本文件 4.1.2 有类型文件 4.1.3 INI文件 4.1.4 无类型文件 4.1.5 文件的复制 4.2 内存映射文件 4.2.1 内存映射文件的应甩 4.2.2 映射文件的使用 4.3 内存映射文件的应用 第5章 创建DLL应用程序 5.1 DLL概述 5.2 DLL的创建 5.2.1 DLL项目文件 5.2.2 Exports关键字的使用 5.2.3 DLL中的变量 5.2.4 DLL实例:动态DLL中的窗体 5.3 DLL的调用 5.3.1 静态调用 5.3.2 动态调用 5.4 DLL的入口函数和出口函数 5.4.1 进程/线程的初始化和例程的终止 5.4.2 DLL入口/出口示例 5.5 利用DLL创建插件程序 5.5.1 插件程序的设计思想 5.5.2 插件应用程序的创建 5.5.3 创建调用插件程序的主程序 第6章 两层数据库应用程序 6.1 关系型数据库 6.1.1 关系型数据库概述 6.1.2 结构化查询语言(SQL) 6.2 数据库的连接 6.2.1 基于BDE的数据库连接 6.2.2 基于0DBC的数据库连接 6.2.3 基于AD0的数据库连接技术 6.3 TSession元件 6.4 1 DahBase组件 6.4.1 TDataBase组件的使用 6.4.2 用配置文件动态设置BDE 6.5 数据访问组件 6.5.1 TTable组件 6.5.2 TQuery组件 6.5.3 TStoredProc过程 6.6 数据感知组件 6.7 事务 第7章 多层数据库应用程序 7.1 一个简单的多层应用系统 7.1.1 服务器端应用程序的建立 7.1.2 客户端应用程序的建立 7.2 多层应用系统处理数据的原理 7.2.1 多层应用系统的结构 7.2.2 存取数据的运作原理 7.2.3 更新数据的运作原理 7.3 容错处理和负载平衡 7.4 Active Form 第8章 Socket编程 8.1 WinSock基础 8.1.1 TCP、UDP和IP协议 8.1.2 套接字(Socket) 8.1.3 客户/服务器模式 8.1.4 面向连接的协议套接字的调用 8.1.5 面向无连接协议的套接字的调用 8.2 利用Winsock API实现Socket编程 8.2.1 常用WinSockAPI函数 8.2.2 利用WinSockAPI实现Socket编程 8.3 利用组件实现Socket编程 8.3.1 TClientSocket组件 8.3.2 TServerSocket组件 8.3.3 远程抓屏示例 8.4 通讯中间件的制作 8.4.1 磁盘队列的实现 8.4.2 客户端和服务器端发送接收磁盘队列数据的套接字的建立 8.4.3 中间件的简单应用 第9章 串口编程 9.1 串口通信的基础知识 9.1.1 同步通信和异步通信 9.1.2 波特率和数据传输率 9.2 串口通信API 9.2.1 DCB数据结构 9.2.2 与串口通信相关的函数 9.3 利用API函数创建串口通信示例 9.3.1 发送数据部分设计(向串口写数据) 9.3.2 数据部分设计(从串口读数据) 9.3.3 程序的具体设计和实现 9.4 利用SPC0MM组件实现串口通信编程 9.4.1 SPCOMM组件的安装 9.4.2 SPCOMM组件的属性、方法和事件 9.4.3 利用SPCOMM通讯组件实现串口通讯的实例 应用篇:物资管理信息系统项目应用开发 第10章 物资管理信息系统概述及其总体框架设计 10.1 系统总体结构设计 10.2 物资管理信息系统需求定义和业务流程图 10.2.1 仓储管理 10.2.2 计划管理 10.2.3 合同管理 10.2.4 物资管理系统的业务流程 第11章 物资管理信息系统后台数据库设计 11.1 关系型数据库概述 11.1.1 关系型数据库 11.1.2 物资管理信息系统数据库的建立 11.2 物资管理信息系统数据结构的设计 11.2.1 权限管理数据结构的设计 11.2.2 仓储管理数据结构的设计 11.2.3 计划管理数据结构的设计 11.2.4 合同管理数据结构的设计 11.2.5 基础设置数据结构的设计 第12章 应用服务器的实现 12.1 创建应用服务器的实例 12.2 状态区编程 12.3 动态数据库的连接 12.4 远程数据模块的建立 第13章 客户端应用程序的设计 13.1 客户端应用程序系统流程和系统功能 13.1.1 系统流程 13.1.2 系统功能 13.2 构建客户端应用程序框架 第14章 动态连接应用服务器的实现 第15章 通用权限管理模块的设计 15.1 系统登录的设计 15.2 权限设计表中数据的维护 第16章 通用查询和报表组件的制作 16.1 通用查询组件的创建 16.2 通用报表模块的制作 第17章 通用基础数据维护模块的设计 17.1 界面设计 17.2 代码实现 17.2.1 以目录树的格式显示部门档案数据 17.2.2 利用目录树导航数据 17.2.3 利用目录树操作数据 17.2.4 按表格的标题排序 17.2.5 打印部门档案 第18章 物资管理信息系统业务操作模块的设计 18.1 数据表的设置 18.2 收料单据主表显示区 18.3 具体的材料明细表显示区 18.4 数据操作区 第19章 综台查询模块的设计 19.1 数据源的设置 19.2 窗体样式设计 19.3 代码实现 19.3.1 查询数据 19.3.2 打印数据 19.3.3 全部浏览
Delphi中,可以使用TClientSocket和TServerSocket组件来实现文件的收发。在TForm1中,可以使用TFileStream来处理文件流。在发送文件的按钮点击事件中,可以使用TClientSocketSocket.SendStream方法将文件流发送给服务器。在TServerSocketClientRead事件中,可以使用TFileStream的LoadFromStream方法将接收到的文件流保存到本地文件中。以下是一个简单的示例代码: ``` // 发送文件 procedure TForm1.btnSendFileClick(Sender: TObject); begin if OpenDialog1.Execute then begin fsSend := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); try cs.Socket.SendStream(fsSend); finally fsSend.Free; end; end; end; // 接收文件 procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket); begin if not Assigned(fsRecv) then begin if SaveDialog1.Execute then begin fsRecv := TFileStream.Create(SaveDialog1.FileName, fmCreate); tStart := True; TickCount := GetTickCount; end; end; if Assigned(fsRecv) then begin fsRecv.CopyFrom(Socket.ReceiveStream, Socket.ReceiveLength); if Socket.ReceiveLength = 0 then begin fsRecv.Free; fsRecv := nil; tStart := False; ShowMessage('文件接收完成'); end; end; end; ``` 在TForm1的FormCreate事件中,可以设置TClientSocket和TServerSocket的属性,如IP地址、端口号等。在TForm1的BtncancelClick事件中,可以取消文件的发送操作。在TForm1的BtnexitClick事件中,可以退出程序。 请注意,以上代码只是一个简单的示例,实际应用中可能需要添加错误处理、进度条显示等功能。 #### 引用[.reference_title] - *1* *2* [Delphi ServerSocket,ClientSocket示例](https://blog.csdn.net/genispan/article/details/3132417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [delphi调用外部程序打开文件](https://blog.csdn.net/weixin_45222383/article/details/91442882)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值