>Procedure TForm1BitBtn1Click(Sender: TObject);
var
I: Integer;
Begin
for I := 0 to ServerSocket1SocketActiveConnections -1 Do
Begin
//if ServerSocket1SocketConnections[I]SocketHandle = XXX then
ServerSocket1SocketConnections[I]SendText('amsg'); //服务端发送
End;
End;
procedure TForm1ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
SocketReceiveText; //客户端接收
end;
所谓Socket就是套接字,套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
一、Socket(套接字)简介:
Socket(套接字)是通信的基石,是支持TCP/IP协议的路通信的基本 *** 作单元。可以将Socket(套接字)看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。Socket(套接字)存在于通信域中,通信域是为了处理一般的线程通过Socket(套接字)通信而引进的一种抽象概念。Socket(套接字)通常和同一个域中的Socket(套接字)交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket(套接字)都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket(套接字)中,该 Socket(套接字)通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket(套接字)中,使对方能够接收到这段信息。 Socket(套接字)是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。
二、Socket(套接字)表达方式:
Socket(套接字)=(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
例如: 如果IP地址是210371451,而端口号是23,那么得到套接字就是(210371451:23)。
三、Socket(套接字)的主要类型:
1流套接字(SOCK_STREAM)
流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。
2数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
3原始套接字(SOCK_RAW)
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接。
要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket,另一个运行于服务器端,我们称之为 Server Socket。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
服务器监听
客户端请求
连接确认
1服务器监听
所谓服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
2客户端请求
所调客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求。
3连接确认
所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求。
根据套接字的不同类型,可以将套接字调用分为面向连接服务和无连接服务。
面向连接服务的主要特点如下:
(1)数据传输过程必须经过建立连接、维护连接和释放连接3个阶段;
(2)在传输过程中,各分组不需要携带目的主机的地址;
(3)可靠性好,但由于协议复杂,通信效率不高。
面向无连接服务的主要特点如下:
(1)不需要连接的各个阶段;
(2)每个分组都携带完整的目的主机地址,在系统中独立传送;
(3)由于没有顺序控制,所以接收方的分组可能出现乱序、重复和丢失现象;
(4)通信效率高,但可靠性不能确保。
1、 Socket(套接字)概念网络上两个程序通过一个双向的通信连接实现数据的交换,这个连接的一段称为一个 socket ,socket是通信的基石,是支持TCP/IP协议的网络通信的基本 *** 作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
Socket是对TCP/IP协议的封装,它把复杂的TCP/IP协议族隐藏在Socket接口后面,提供一个易用的接口,所以Socket本身并不是协议,而是一个调用接口(API)。
在一定程度可以认为Socket位于应用层和传输层之间。创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
2、 建立Socket连接
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。
套接字之间的连接过程分为 三个步骤 :
(1)服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
(2)客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户 端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
3、 Socket连接与>TCP:
建立ServerSocket连接后进行Socket通信
1、初始化SOCKET运行库;
2、配置通信地址;
3、创建(socket)SOCKET;
4、绑定(bind)SOCKET地址;
5、监听(listen)SOCKET地址;
6、接受(accept)SOCKET的连接;
在建立ClientSocket时,服务端需要进行:
1、初始化SOCKET运行库;
2、配置通信地址;
3、创建(socket)SOCKET;
4、连接(connect)服务器端的地址;服务器端就是需要一个循环不停的接收,这样才能保证服务器能一直监听客户端传过来的数据
你这是同步的,如果用异步socket的话,BeginReceive里面注册了一个回调函数,在回调里面再次调用BeginReceive就可以一直监听了using SystemNet;
using SystemNetSockets;
static void Main(string[] args)//服务器段
{
int port = 2000;
string host = "127001";
//
///创建终结点(EndPoint)
IPAddress ip = IPAddressParse(host);//把ip地址字符串转换为IPAddress类型的实例
IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例
//
///创建socket并开始监听
Socket s = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);//创建一个socket对像,如果用udp协议,则要用SocketTypeDgram类型的套接字
sBind(ipe);//绑定EndPoint对像(2000端口和ip地址)
sListen(0);//开始监听
ConsoleWriteLine("等待客户端连接");
//
///接受到client连接,为此连接建立新的socket,并接受信息
Socket temp = sAccept();//为新建连接创建新的socket
ConsoleWriteLine("建立连接");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = tempReceive(recvBytes, recvBytesLength, 0);//从客户端接受信息
recvStr += EncodingASCIIGetString(recvBytes, 0, bytes);
//
///给client端返回信息
ConsoleWriteLine("server get message:{0}", recvStr);//把客户端传来的信息显示出来
string sendStr = "ok!Client send message successful!";
byte[] bs = EncodingASCIIGetBytes(sendStr);
tempSend(bs, bsLength, 0);//返回信息给客户端
tempClose();
sClose();
ConsoleReadLine();
}
static void Main(string[] args)//客户端
{
try
{
int port = 2000;
string host = "127001";
//
///创建终结点EndPoint
IPAddress ip = IPAddressParse(host);
//IPAddress ipp = new IPAddress("127001");
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndpoint实例
//
///创建socket并连接到服务器
Socket c = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);//创建Socket
ConsoleWriteLine("Conneting…");
cConnect(ipe);//连接到服务器
//
///向服务器发送信息
string sendStr = "hello!This is a socket test";
byte[] bs = EncodingASCIIGetBytes(sendStr);//把字符串编码为字节
ConsoleWriteLine("Send Message");
cSend(bs, bsLength, 0);//发送信息
//
///接受从服务器返回的信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = cReceive(recvBytes, recvBytesLength, 0);//从服务器端接受返回信息
recvStr += EncodingASCIIGetString(recvBytes, 0, bytes);
ConsoleWriteLine("client get message:{0}", recvStr);//显示服务器返回信息
//
///一定记着用完socket后要关闭
cClose();
}
catch (ArgumentNullException e)
{
ConsoleWriteLine("argumentNullException: {0}", e);
}
catch (SocketException e)
{
ConsoleWriteLine("SocketException:{0}", e);
}
ConsoleWriteLine("Press Enter to Exit");
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)