第4章TCPSocket编程_第1页
第4章TCPSocket编程_第2页
第4章TCPSocket编程_第3页
第4章TCPSocket编程_第4页
第4章TCPSocket编程_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、图4-1 操作系统中关于以太网卡的信息打开每台计算机的IP地址都不一样子网掩码一般都是255.255.255.0图4-2 Windows98/me 网络属性图4-3 Windows98/me IP地址设置图4-4 Windows Xp中的TCP/IP属性对话框图4-5网路连通测试成功图4-6 网路连通测试失败 在Winsock中套接字可以是阻塞方式,也可以是非阻塞方式。处于阻塞方式的套接字的函数,在完成其任务之前是不会返回的。这样,在该函数调用返回前,这个套接字就不能进行其他任何操作,调用它的进程也会处于挂起状态,所以称为阻塞方式。例如,在调用ReceiveBuf()函数时,可能要花费相当长的

2、时间来等待数据的到来,在这段时间内,调用ReceiveBuf ()的进程就无法继续执行。特别是在某些情况下,当发送方的数据根本无法到达时,该进程就会无限地等待下去。除此之外,当用户在长时间等待后失去耐心而试图关闭程序时,还会导致系统限于危险境地。BerkeleySocket的很多函数都是阻塞方式的。 Delphi 6.0中的Winsock有客户套节字(ClientSocket、TcpClient)和服务器套节字(ServerSocket、TcpServer)之分。ClientSocket和ServerSocket里面均包含一个Socket对象,真正用来通信的方法在Socket里面。下面分别讨论

3、客户套节字的属性、事件、方法。图4-7 Delphi 6中网络客户套接字属性图4-8 Delphi 6中网络客户套接字事件 function ReceiveLength: Integer; function Socket.ReceiveBuf(var Buf; Count: Integer): Integer; function Socket.SendBuf(var Buf; Count: Integer): Integer; 这两个方法可以接收和发送二进制的数据也可以发送字符串数据,与Record类型配合可以完成各种数据的操作。图4-10 Delphi 6中网络服务器套接字事件图4-9 De

4、lphi 6中网络服务器套接字属性 function ReceiveLength: Integer; function Socket.ReceiveBuf(var Buf; Count: Integer): Integer; function Socket.SendBuf(var Buf; Count: Integer): Integer; 这两个方法可以接收和发送二进制的数据也可以发送字符串数据,与Record类型配合可以完成各种数据的操作。 通信前必须先连接,连接前必须把客户的Address或Host设为服务器计算机的IP地址,客户的Port与服务器的Port必须相等,服务器的Active

5、必须设为true。具体的连接动作就是客户的Active:=true。当连接成功后,客户的OnConnect事件发生。 应当注意,一个服务器Socket可供若干个客户连接。服务器Socket中专门有一个记录数组Connections记录客户的连接情况。 客户通过SendBuf发送的信息由服务器的OnClientRead事件调用ReceiveBuf接收,服务器通过SendBuf发送的信息由客户的OnRead事件调用ReceiveBuf接收。 数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。在Visual Basic 6.0中的Winsock没有客户与服务器之分。它

6、既可以当客户用,也可以做服务器用,完全靠Winsock内的属性、方法、事件的具体配合。 如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。 如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。图4-11 Visual Basic 6.0 部件对话框 对话前

7、先连接,服务器必须有自己的IP地址和Port号,并且处于活动状态,等待客户随时的连接请求。 连接时,客户端先确定服务器端的IP地址和Port号,然后调用连接的方法向服务器请求连接,服务器同意后将客户记录在案,以后就可以互相对话。 客户通过发送方法发送信息给服务器,服务器在接收数据的事件里通过接收数据的方法接收客户的信息。服务器通过发送方法给客户回答信息,客户在接收数据的事件里通过接收数据的方法接收服务器的信息。 在整个对话过程中,发送数据容易实现,接收数据较难实现。这是因为接收数据是被动的,需要随时等待,所以这个过程要放在接收事件里,由接收事件触发接收的方法完成接收数据的任务。属性客户服务器a

8、ddress指定服务器的IP地址要有确定的IPPort与服务器保持一致要有确定的Port事件客户服务器连接觉察服务器送来的已经连通事件觉察客户送来的请求连接事件收到数据觉察服务器送来的数据,调用接收数据的方法觉察客户送来的数据,调用接收数据的方法表4-7 属性的基本配合原则表4-8 事件的基本配合原则方法客户服务器连接向服务器请求连接接纳接纳客户发送数据根据实际需要随时可以进行处理客户的请求后返回信息接收数据在收到数据的事件里进行在收到数据的事件里进行表4-9方法的基本配合原则图4-12 Delphi 6设计的客户端(1)可与服务器连接通信。(2)运行后等待用户确定要连接的服务器的IP地址和p

9、ort号,提示“未连接”,“发送”按钮不可用。(3)设立“断开”按钮可断开与服务器之间的连接。(4)设立“打开”按钮可恢复与服务器之间的连接。(5)当用户确定了服务器的IP地址和port号后,点击“连接”按钮进行连接。(6)当连接成功后在屏幕上显示“连接OK”,将“发送”按钮设为可用。(7)当服务器断开时显示“未连接”, “发送”按钮设为不可用。 (8)在发送文本框里键入文本,通过点击“发送”按钮发送到服务器。(9)在接收文本框里显示来自服务器的文本信息,随时等待服务器送来的信息。 连接的动作:ClientSocket1.Active:=true 发送信息的动作:ClientSocket1.S

10、ocket.SendText(信息文本) 接收信息的动作:ClientSocket1.Socket.ReceiveText 在事件ClientSocket1Read里进行unit ClientUnit;/说明: 这是一个简单的实例, 仅仅表明属性设置, 事件编程, 连接及连接情况,/ 发送数据,接收数据的全过程. 其中的发送和接收使用的方法/ SendText和ReceiveText 都是针对字符串的,/ 现实中的数据应该是二进制数据, 应该使用/ Sendbuf和Receivebuf ,处理过程也要复杂得多interfaceuses Windows, Messages, SysUtils,

11、Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ScktComp, ExtCtrls;type TForm1 = class(TForm) ClientSocket1: TClientSocket; /客户 Socket 构件 BitBtn1: TBitBtn; /连接按钮 Label1: TLabel; /显示连接情况 Memo1: TMemo; /键入发送内容的文本编辑器 Button1: TButton; /发送按钮 Memo2: TMemo; /存放接收到的内容 Label2: TLab

12、el; /显示收到字符数 Button2: TButton; /断开按钮 Button3: TButton; /打开按钮 LabeledEdit1: TLabeledEdit; /编辑IP地址 LabeledEdit2: TLabeledEdit; /编辑Port号 procedure BitBtn1Click(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject;

13、 Socket: TCustomWinSocket); procedure Button1Click(Sender: TObject); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure FormShow(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private Private declarations public Publ

14、ic declarations end;var Form1: TForm1;implementation$R *.dfmprocedure TForm1.BitBtn1Click(Sender: TObject); /连接按钮beginClientSocket1.ClientType:=ctNonBlocking; /选择无阻塞方式ClientSocket1.Address:=LabeledEdit1.Text; /连接前设定IP地址ClientSocket1.Port:=strtoint(Labelededit2.Text); /连接前设定 端口号ClientSocket1.Active:=

15、true; /连接的动作end;procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); /连接成功的事件beginlabel1.Caption:=连接 OK!; /连接成功的提示信息Button1.Enabled:=true; /将发送按钮设为可用end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); /连接失败事件beginlabel1.Caption:=无连接;

16、/连接失败时提示信息Button1.Enabled:=false; /将发送按钮设为不能用end;procedure TForm1.Button1Click(Sender: TObject);beginClientSocket1.Socket.SendText(memo1.text); /发送memo1中的数据memo1.Lines.Clear; /清理memo1end;procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); /读数据事件var ss:string;beginss:=Clien

17、tSocket1.Socket.ReceiveText; /及时获得服务器送来的信息memo2.Lines.Add(ss); /将获得的字符串放进memo1,使之成为可见end;procedure TForm1.FormShow(Sender: TObject); /屏幕初始事件begin LabeledEdit2.Text:=inttostr(ClientSocket1.Port); /屏幕上获得客户端口号end;procedure TForm1.Button2Click(Sender: TObject);beginClientSocket1.Close; /关闭连接end;procedur

18、e TForm1.Button3Click(Sender: TObject);beginClientSocket1.ClientType:=ctNonBlocking; /选择无阻塞方式ClientSocket1.Address:=LabeledEdit1.Text; /连接前设定IP地址ClientSocket1.Port:=strtoint(Labelededit2.Text); /连接前设定 端口号ClientSocket1.Open; /打开连接 /同 ClientSocket1.Active:=true 意思相同end;end. 创建客户应用程序,必须有Winsock构件,还要知道服

19、务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。由于在实际中的服务器IP不确定,所以设有更改远程IP和端口号的文本框,如图4-13。 具体编程过程可分为: 连接的动作:Winsock1.Connect 发送信息的动作:Winsock1.SendData (文本信息) 接收信息的动作:Winsock1.GetData strData在事件Winsock1_DataArrival里进行图4-13 Visual Basic 6设计的客户端用 作 客 户 的Winsock必须具备可供选择的服务器端IP

20、和端口号Dim mm As Long 接收字符计数器Dim kk As Long 接收字节计数器Dim nn As Long 接收次数计数器Private Sub Command1_Click() 连接服务器按钮Winsock1.RemoteHost = Text1(0).Text 确定服务器IP地址Winsock1.RemotePort = Val(Text1(1).Text) 确定服务器端口号Winsock1.Connect 连接方法End SubPrivate Sub Command2_Click() 发送数据按钮Winsock1.SendData (Text3.Text) 发送方法La

21、bel4.Caption = 字符数 & Len(Text3.Text) 显示发送的字符数Label4.Caption = Label4.Caption + 字节数 & LenB(Text3.Text) 显示发送的字节数End SubPrivate Sub Winsock1_Close() 服务器断开事件 Winsock1.Close 套接字关闭 Label3.Caption = 未连接 显示连接成功 Command2.Enabled = False 允许发送数据 End SubPrivate Sub Winsock1_Connect() 连接成功事件 Label3.Capti

22、on = 连接成功 显示连接成功 Command2.Enabled = True 允许发送数据End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 收到数据事件 Dim strData As String 定义临时变量Winsock1.GetData strData, vbString 获得数据 mm = mm + Len(strData) 计算字符数 kk = kk + LenB(strData) 计算字节数 Text2.Text = Text2.Text & Chr(13) & Chr(10) & strData 显示接收内容 nn = nn + 1 统计接收次数 Label2.Caption = 接收到 & nn & 次 & 共 & mm & 字符 Label2.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论