选择显示字体大小

利用delphi编写socket通信程序

一、delphisocket

  计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的tcp/ip和udp协议。tcp是面向连接的,通信双方保持一条通路,好比目前的电话线,使用te.net登陆bbs,用的就是tcp协议;udp是无连接的,通信双方都不保持对方的状态,浏览器访问inte.net时使用的http协议就是基于udp协议的。tcp和udp协议都非常复杂,尤其是tcp协议,为了保证网络传输的正确性和有效性,必须进行一系列复杂的纠错和排序等处理。
  socket是建立在传输层协议(主要是tcp和udp)上的一种套接字规范,最初是由美国加州berkley大学提出,它定义两台计算机间进行通信的规范(也是一种编程规范),如果说两台计算机是利用一个“通道“进行通信,那么这个“通道“的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了tcp协议软件和实现了套接字规范的计算机之间的通信成为可能。
  微软的windows socket规范(简称winsock)对berkley的套接字规范进行了扩展,利用标准的socket的方法,可以同任何平台上的socket进行通信;利用其扩展,可以更有效地实现在windows平台上计算机间的通信。在delphi中,其底层的socket也应该是windows的socketsocket减轻了编写计算机间通信软件的难度,但总的说来还是相当复杂的(这一点在后面具体会讲到);inprise在delphi中对windows socket进行了有效的封装,使得用户可以很方便地编写网络通信程序。下面我们实例解读在delphi中如何利用socket编写通信程序。
二、利用delphi编写socket通信程序。
  下面是一个简单的socket通信程序,其中客户机和服务机是同一个程序,当客户机(服务器)在一个memo1中输入一段文字然后敲入回车,该段文字就可以显示在服务器(客户机)的memo2中,反之亦成立。具体步骤如下:
  1、新建一个form,任意命名,不妨设之为chatform;放上一个mainmenu(在standard栏中),建立listenitem、connectitem、disconnect和exit菜单项;在从inte.net栏中选择tserversocket、tclientsocket添加到chatform中,其中把tclientsocket的名字设为clientsocket, port设为1025,默认的active为false;把tserversocket的名字设为serversocket,port设为1025,默认的active为false,其他的不变;再放入两个memo,一个命名为memo1,另外一个命名为memo2,其中把memo2的color设置为灰色,因为主要用来显示对方的输入。下面我们一边编写代码一边解? 因。
  2、双击listemitem。写入如下代码:
procedure tchatform.listenitemclick(sender: tobject);
begin
listenitem.checked := not listenitem.checked;
if listenitem.checked then
begin
clientsocket.active := false;
serversocket.active := true;
end
else
begin
if serversocket.active then
serversocket.active := false;
end;
end;

  该程序段的说明如下:当用户选择listemitem时,该listenitem取反,如果选中的话,说明处于listen状态,读者要了解的是:listen是socket作为server时一个专有的方法,如果处于listen,则serversocket设置为活动状态;否则,取消listen,则关闭serversocket。实际上,只有用户一开始选择该菜单项,表明该程序用作server。反之,如果用户选择connectitem,则必然作为client使用。
  3、双击connectitem,敲入以下代码。
procedure tchatform.connectitemclick(sender: tobject);
begin
if clientsocket.active then clientsocket.active := false;
if inputquery(computer to connect to, address name:, server) then
if length(server) $#@62; 0 then
with clientsocket do
begin
host := server;
active := true;
listenitem.checked := false;
end;
end;

  这段程序的主要功能就是当用户选择connectitem菜单项时,设置应用程序为客户机,弹出input框,让用户输入服务器的地址。这也就是我们不一开始固定clientsocket的host的原因,这样用户可以动态地连接不同的服务器。读者需要了解的是主机地址只是socket作为客户机时具有的一个属性,socket作为服务器时“一般“不用地址,因为它同本机绑定。
  4、在memo1的keydown方法中写入如下代码:
procedure tchatform.memo1keydown(sender: tobject; var key: word;
shift: tshiftstate);
begin
if key = vk_return then
if isserver then
serversocket.socket.connections[0].sendtext(memo1.lines[memo1.lines.count - 1])
else
clientsocket.socket.sendtext(memo1.lines[memo1.lines.count - 1]);
end;

  该段代码的作用很明显,就是开始发消息了。其中如果是server的话,它只向第一个客户机发消息,由于一个服务器可以连接多个客户机,而同客户机的每一个连接都由一个socket来维持,因此serversocket.socket.connnections数组中存储的就是同client维持连接的socket。在标准socket中,服务器方的socket通过accept()方法的返回值获取维持同客户机连接的socket,而发送、接受消息的方法分别为send(sendto)和recv(recvfrom), delphi对此进行了封装。
  5、其余代码的简要介绍。
procedure tchatform.serversocketaccept(sender: tobject;
socket: tcustomwinsocket);
begin
isserver := true;
end;

  serversocket的accept方法,当客户机第一次连接时完成,通过其参数可以认为,它是在标准的accept方法后执行的,因为有tcustomwinsocket这个参数类型,它应该是标准server方socket的返回值。

procedure tchatform.clientsocketread(sender: tobject;
socket: tcustomwinsocket);
begin
memo2.lines.add(socket.receivetext);
end;

procedure tchatform.serversocketclientread(sender: tobject;
socket: tcustomwinsocket);
begin
memo2.lines.add(socket.receivetext);
end;

  这两段代码分别是服务器方和客户机方在收到对方的消息时,由delphi触发的,作用是在memo2中显示收到的消息。其中,clientsocketread中的socket实际上就是socket本身,而在serversocketclientread中的socket实际上是serversocket.socket.connection[]中的某个socket。不过在delphi中,对服务器方的socket进行了有效的封装。
procedure tchatform.serversocketclientconnect(sender: tobject;
socket: tcustomwinsocket);
begin
memo2.lines.clear;
end;
procedure tchatform.clientsocketdisconnect(sender: tobject;
socket: tcustomwinsocket);
begin
listenitemclick(nil);
end;

  这两段比较简单。其中serversocketclientconnect在serversocket收到一个新的连接时触发。而clientsocketdisconnect在clientsocket发出disconncet时触发。

procedure tchatform.exit1click(sender: tobject);
begin
serversocket.close;
clientsocket.close;
close;
end;
procedure tchatform.disconnect1click(sender: tobject);
begin
clientsocket.active := false;
serversocket.active := true;
end;

  第一段为关闭应用程序。在标准socket中,每个socket在关闭时,必须调用closesocket()方法,否则系统不会释放资源。而在serversockt.close和clientsocket.close中,系统内部肯定调用了closesocket()方法。
三、标准socketdelphi中的socket
标准的socket的应用程序框架如下:
server方: socket()[ 新建一个socket]--bind()[ 同服务器地址邦定 ]--listen() --accept()--block wait--read()[接受消息,在windows平台中,方法为send(tcp),或者是sendto(udp)]--处理服务请求--write()[发送消息,在windows平台中,方法为send(tcp), 或者为sendto(udp)。
client方相对简单:socket()--connect()[通过一定的port连接特定的服务器,这是与服务器建立连接]--write()--read()。
  socket可以是基于tcp的,也可以是基于udp,同时socket甚至建立在其他的协议,比如ipx/spx,de.net等。在新建一个socket时,可以指定新建何类socket。bind()用来同服务器的地址邦定,如果一个主机只有一个ip地址,实际上邦定的作用就相对多余了。listen()开始监听网络,accept()用于接受连接,其返回值是保持同客户机联系的socket
  在delphi中,对于windows中的socket进行了有效的封装。在delphi中,按其继承关系,可以分层两类:
一、tcomponent--tabstractsocket--tcustomsocket--tcustomserversocket--tserversocket
tcomponent--tabstractsocket--tcustomsocket--tclientsocket
二、直接从tobject继承过来:
tobject--tcustomwinsocket--tserverwinsocket
tobject--tcustomwinsocket--tclientwinsocket
tobject--tcustomwinsocket--tserverclientwinsocket
  可以看出第一类建立在tcustomsocket基础上,第二类建立在tcustomwinsocket的基础上。第一类建立在tcomp.net的基础上,第二类直接构建在tobject基础上。因此如果用户非常熟悉socket并且想要编写控制台程序时,可以使用tcustomwinscoket类。
  同uses中可以看出,它们都在scktcomp.pas中实现,而在schtcomp.pas中,则包含了winsock.pas文件,如果继续深入winsock文件,在其中可以发现所有的windows socket的基本方法。

  实际上,如果你了解了标准socket的应用程序框架,对于使用delphi编写socket应用程序也就得心应手了;这不是说你必须了解复杂的socket中的标准函数,也没有必要,因为delphi已经为你做了很好的封装了,这也正是delphi的强势所在,你只要了解那么一点点的基本框架
  这是我对delphi中的socket应用的理解,不足之处希望大家指正。同时也乐于为大家解答delphi中有关socket的问题。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons