工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > Delphi > 正文
利用Delphi编写Socket通信程序
[文章信息]
作者:AustinLei
时间:2004-11-08
出处:天极论坛
责任编辑:方舟
[文章导读]
本文将本人总结出来的TServerSocket和TClientSocket两个组件的基本用法写出来,希望与您分享
advertisement
热点推荐
· 真没想到VB也可以这样用之指针技术
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
[正文]

上一页  1 2 3  下一页

  程序源代码:

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

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.


上一页  1 2 3  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 用Delphi设计“抢三十”游戏
  • 对《QQ列表精灵》源代码分析和仿制
  • Delphi接口编程的两大陷阱
  • 基于Delphi的组件设计之简单实例
  • 基于Delphi的组件设计之概念
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement