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协议的数据通信。
2、TCP
面向连接的通信是通过“传输控制协议”(Transmission Control Protocol, TCP)来完成的。TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。这个连接一旦建立,两台计算机之间就可以把数据当作一个双向字
节流进行交换。
3、UDP
无连接通信是通过“用户数据报协议”(User Datagram Protocol, UDP)来完成的。UDP不保障可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。简单地说,如果一个客户机向服务

本文详细介绍了Delphi中使用Winsock进行网络编程的基础知识,包括Winsock的API函数、套接字的创建、连接、监听和数据传输。重点讲解了TCP/IP协议下的Winsock编程,包括TCP和UDP的区别,以及服务器端的bind、listen、accept和客户端的connect操作。文章还提到了数据传输的send和recv函数,以及如何优雅地关闭连接。最后,讨论了不同I/O模型的选择,推荐了适合客户机和服务器开发的模型。
1237

被折叠的 条评论
为什么被折叠?



