Delphi Socket编程(1)

本文详细介绍了Delphi中使用Winsock进行网络编程的基础知识,包括Winsock的API函数、套接字的创建、连接、监听和数据传输。重点讲解了TCP/IP协议下的Winsock编程,包括TCP和UDP的区别,以及服务器端的bind、listen、accept和客户端的connect操作。文章还提到了数据传输的send和recv函数,以及如何优雅地关闭连接。最后,讨论了不同I/O模型的选择,推荐了适合客户机和服务器开发的模型。
摘要由CSDN通过智能技术生成
 
这篇文章来自网络;个人感觉有点杂乱;撮合着看下吧。
 
1. Socket 定义:     
    socket非常类似于 电话 插座。以一个国家级电话网为例。
              电话 的通话双方相当于相互通信的2个进程,区号是它的 网络地址 ;区内一个单位的 交换机 相当于一台 主机 ,主机分配给每个用户的局内号码相当于socket号。
        1. 申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。
        2.发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出 网络地址 )。
        3.对方假如在场并空闲(相当于通信的另一 主机 开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功
       4.双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。
      5. 通话结束后,一方挂起电话机相当于关闭socket,撤消连接

    

WINSOCK的基本概念
        基层网络协议,Winsock是访问它们的首选接口

            要说明的是,Winsock是网络编程接口,而不是协议。  

  Winsock的API是建立在套接字基础上的。所谓套接字,就是一个指向传输提供者的句柄Win32中,套接字不同于文件描述符,所以它是一个独立的类型—SOCKET。

 

第一个程序
        一个在服务器和客户机之间建立连接并通讯的程序。
            我们使用TServerSocket组件来建立服务器端的程序。
      它包含两个memo组件,用来分别处理接收到的数据和发送的数据,然后再在窗体上方一个TServerSocket组件,ServerType设置为stNonBlocking,Port设置为100,active设置为true,写几句简单的代码如下:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    Button1: TButton;
    StatusBar1: TStatusBar;
    Memo2: TMemo;
    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;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if ServerSocket1.Active then
     ServerSocket1.Socket.Connections[0].SendText(Memo2.Text);
end;

end.

{然后编译程序。

客户端实现:
   客户端相对复杂一些,因为我们要有一个用来接收服务器IP地址的edit,以及端口地址的edit。
}

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    edIp: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    edPort: TEdit;
    StatusBar1: TStatusBar;
    Memo1: TMemo;
    btnConnect: TButton;
    btnSent: TButton;
    btnDisconnect: TButton;
    Memo2: TMemo;
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure btnConnectClick(Sender: TObject);
    procedure btnDisconnectClick(Sender: TObject);
    procedure btnSentClick(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    ...{ Private declarations }
  public
    ...{ Public declarations }
  end;

var
  Form1: TForm1;

implementation

...{$R *.dfm}

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   StatusBar1.SimpleText := '连接成功';
end;

procedure TForm1.btnConnectClick(Sender: TObject);
begin
   if not ClientSocket1.Active then
   begin
     ClientSocket1.Host := edIp.Text;
     ClientSocket1.Port := StrToInt(edPort.Text);
     ClientSocket1.Open;
     (Sender as TButton).Enabled := false;
     btnDisconnect.Enabled := true;
   end;
end;

procedure TForm1.btnDisconnectClick(Sender: TObject);
begin
   if ClientSocket1.Active then
   begin
     ClientSocket1.Close;
     btnDisconnect.Enabled := false;
     btnConnect.Enabled := true;

   end;
end;

procedure TForm1.btnSentClick(Sender: TObject);
begin
   if ClientSocket1.Active then
     ClientSocket1.Socket.SendText(Memo1.Text)
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   Memo2.Lines.Add(Socket.ReceiveText);
end;

end


我们可以使用Winsock来编程一个网络会话程序。

      TClientSocket以及TServerSocket是一个组件,他们的目的是让我们可以建立典型的客户机/服务器模式的通讯程序

 

勿在浅沙筑高楼。在谈论TServerSocket等组件编写之前,这里先对Winsock中一些基本概念和API函数做一个简单的说明。
一、定址
      要通过Winsock建立通信,必须了解如何利用指定的协议为工作站定址。Winsock 2引入了几个新的、与协议无关的函数,它们可和任何一个地址家族一起使用;但是大多数情况下,各协议家族都有自己的地址解析机制,要么通过一个函数,要么作为一个投给getsockopt的选项。
     因为目前网络编程中用的最多最普遍的也许就是TCP/IP协议了,所以这里主要介绍此协议下的WinSock编程

1、IP
   网际协议(Internet Protocol, IP)是一种用于互联网的网络协议,已经广为人知。它可广泛用于大多数计算机操作系统上,也可用于大多数局域网LAN(比如办公室小型网络)和广域网WAN(比如说互联网)。从它的设计看来, IP是一个无连接的协议,不能保证数据投递万
无一失。两个比它高级的协议(TCP和UDP)用于依赖IP协议的数据通信。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值