Socket在局域网通信中应用

本文摘自“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在局域网通信中应用,就是以上的说明了,希望对读者有所帮助,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值