本文摘自“socket编程原理”,如需详细了解socket编程请下载socket编程原理
地址:http://download.csdn.net/detail/qq348931837/5908885
基本原理:
在Windows网络编程,套接字接口主要有3种类型:流式套接字,数据报套接字和原始套字。流式套接字定义了一种面向连接的服务,实现了无差错无重复的顺序数据传输,无长度限制。数据报套接字接口定义了一种无连接服务,数据通过相互独立的报文进行传输,它是无序的,并不能保证可靠。原是套接字允许对底层协议IP或ICMP直接访问,主要应用于网络协议的测试,在网络应用中使用最多的是客户/服务器模式,主要是采用面向连接的TCP协议,其典型的套接字接口调用流程如图
程序中需要用到两个重要的组件,ClientSocket组件为客户端组件,它是通信的请求方,主动与服务器端建立连接,ScrverSocket组件为服务器端组件,它是通信的响应方,主要是监听以及被动接受客户端的连接请求,并对请求进行回复。ServerSoker组件可以同时接受一个或多个ClientSocket组件的连接请求,并于每个ClientSocket组件建立单独的连接请求,并于每个ClientSocket组件建立单独的连接,进行单独的通信,因此,一个服务器端可以为多个客户端服务。
程序实现:该程序包括一个服务器端程序和一个客户端程序,其中客户端程序可以放到多个计算机上运行,同时与服务器端进行连接通信。程序主要解决两个方面的问题,一是如何建立客户端和服务器端的通信,二是当有多个客户端同时连接到服务器端时,服务器端如何识别每个客户端,为了保证某个客户端断开时不影响其它客户端与服务器之间的通信,同时保证服务器端能正确回复客户端的请求,因此在程序中特别声明了一个记录类型和记录客户端连接数组:
type:
Client_record=record
CHandle:integer;
SS_Handle:integer;//代理服务器套接字句柄
CSocket:TCustomWinSocket;
CName:string;
CAddress:string;
CUsed:boolean;//客户端联机标志
end;
Session:array[0..CMax] of client_record;
利用这个记录类型数据保存客户端的信息,同时保存当前客户端的连接状态。CHandle保存客户端套接字句柄,以便准确定位每个与服务器端保持连接的客户端;Csocket保存客户端套接字,通过它可以对客户端进行回复,CMax为客户端允许的最大连接数。Cused记录当前客户端是否与服务器端保持连接。下面对组件ServerSocket和ClientSocket的属性设置简单说明如下:
ServerSocker的属性:
(1)Port,是通信的端口,必须设置,建议将端口设置在1024以上,在本例中设置为1028;
(2)ServerTypt,服务器端读写信息类型,设置为stNonBlocking表示异步读写信息,本例中采用这种方式。
(3)TheradCacheSize,客户端的最大连接数,就是服务器端最多允许多少客户端同时连接,可以根据需求设定。
ClientSocket的属性:
(4)Port,客户端通信的端口,必须与服务器端的设置相同。
(5)ClientType,客户端读写信息类型,应与服务器端的设置相同,为stNonBlocking表示异步读写信息
(6)Host,客户端要连接的服务器的IP地址。必须设置。当然也可以在代码中动态设置。其他属性采用默认设置即可。
建立其客户端和服务器端的连接后,就可以进行通信了。Delphi为TServerSocket和TClienySocket提供了几种通信方法,用SendBuf发送指定数据的长度。需要注意的是,用SendBuf发送指定数据的长度。需要注意的是,由于Windows默认缓冲区大小为8K,所以当发送大于8K的信息时,必须采用分组循环发送的方式,利用Delphi的TServerSocket与TClienySocket构件进行数据发送的接收的一般步骤为:
服务器端
(1)打开套接字连接,监听客户端的连接请求ServerSocket.Open;
(2)与客户端建立连接后,记录该客户的特征,并接受客户端发送的信息
Session[i].CHandle:=Socket.SocketHandle;
Session[i].CSocket:=Socket;
Session[i].CName:=Socket.RemoteHost;
Session[i].CAddress:=Socket.RemoteAddress;
Session[i].CUsed:=True;
Memol.Lines.Add(Socket.ReceiveText);
(3)当某个客户端与服务器断开连接时
if session[i].CHandle=Socket.SocketHandle then
begin
Session[i].CHandle:=0;
Session[i].CUsed:=False;
end;
客户端
(1)打开套接字与服务器建立连接 ClientSocket.Open;
(2)连接成功后,向服务器端发送信息 ClientSocket.Socket.SendText(Editl,Text);
(3)通信完成后,断开连接 ClientSocket.Close;
-------------------------------------------------------Socket在局域网通信中应用,就是以上的说明了,希望对读者有所帮助,谢谢!!!