大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 用WinSock控件编写网络聊天器

用WinSock控件编写网络聊天器

时间: 2021-07-31 作者:daque

一.看法c++builder中的winsock控件及其关系类  winsock是一组用c谈话写的api,用来经过internet举行数据传输。经过winsock编制程序不妨赢得更大的精巧性。编写winsock运用步调从来是很烦恼的,然而,在c++ builder 5.0中,您并不须要径直与winsock中的api打交道,由于c++ builder 5.0新减少了tclientsocket控件和tserversocket控件,这两个控件封装了windows的相关api,使得对winsock的考察大大简化。用socket 创造的贯穿是创造在tcp/ip和议普通上的,同声也扶助其它关系的和议,如xns、decnet以及 ipx/spx等。socket的贯穿必需要创造有一个效劳器端(server)和一个存户端(client)。在c++ builder 5.0中辨别用tclientsocket控件和tserversocket控件来安排存户端socket与效劳器端socket的 贯穿和通讯。这两个控件用来处置效劳器和存户的贯穿,它们自己并不是socket东西,安排 socket东西的是tcustomwinsocket及其派生类,如tclientwinsocket、tserverwinsocket . tserverclientwinsocket等。  socket之间的贯穿不妨分为三种典型:存户端贯穿、监听贯穿以及 效劳器端贯穿,所谓存户端贯穿,是指由存户端的socket提出贯穿乞求,要贯穿的目的是效劳 器端的socket。为此,存户端的socket必需开始刻画它要贯穿的效劳器端socket(主假如指效劳器 端socket的地方和端标语),而后再定位所要贯穿的效劳器端socket,找到此后,就向效劳器端 socket乞求贯穿。固然,效劳器端的socket此时偶然凑巧居于筹备好状况,然而,效劳器端的 socket会机动保护存户乞求贯穿的部队,而后在它觉得符合的功夫向存户端socket发出“承诺贯穿” (accept)的旗号,这时候存户端socket与效劳器端socket的贯穿就创造了。所谓监听贯穿,效劳器端 socket并大概位简直的存户端socket,而是居于等候贯穿的状况。当效劳器端socket监听到大概说 接受到存户端socket的贯穿乞求,它就相应存户端socket的乞求创造一个新的socket句柄并与存户 端贯穿,而效劳器端socket连接居于监听状况,还不妨接受其它存户端socket的贯穿乞求。所谓服 务器端贯穿,是指当效劳器端socket接受到存户端socket的贯穿乞求后,就把效劳器端socket的刻画 发给存户端,一旦存户端确认了此刻画,贯穿就创造了。在正文中的谈天步调用的即是监听贯穿, 即效劳器树立贯穿个数保守行监听,存户端举行对效劳器端的贯穿,如许就不妨举行彼此通讯了。 二.tserversocket和tclientsocket控件的属性1.serversocket的控件属性 threadcachsize:创造效劳器线程的最在数量。 port:决定效劳器的监督端口。 service:存户经过此属性来辨别效劳器端口。 2.clientsocket的控件属性 socket:此属性参数是运用步调之间通讯的端点。 address:此属性参数为字符串典型,存户端决定效劳器端的ip地方。 host:效劳器端的长机称呼。 post:效劳器端的监督端口。 servce:用来辨别效劳器端口。 active:决定socket能否可用(true表白可用)。 clienttype:指定存户机沿用哪一种办法(异步/同步)来通讯。三.serversocket和clientsocket控件的事变1.serversocket的事变 onclientconnect:存户与效劳器贯穿且效劳器接受请求后,爆发此事变。 onclientdisconnect:当和效劳器贯穿的某一个存户机封闭贯穿后爆发此事变。 ongetsocket:一个效劳器不妨接受多个存户socket的贯穿请求。 ongetthread:当clienttype属性值设为strthreadblocking时,效劳器会爆发一个独立的线程来与存户的贯穿。 onaccept:效劳器接受存户的贯穿请求后,爆发此事变。 onclientread:存户机发送数据到效劳器时爆发的事变。2.clentsocket事变 onconnect:当存户端与效劳器端贯穿上后,爆发此事变。 onconnecing:当存户端与效劳器端举行贯穿操纵时,爆发此事变。 ondisconnect:当存户端封闭操纵后爆发此事变。 onerror:在存户与效劳器在创造和通讯进程中,即使爆发缺点时,爆发此事变。 onlookup:当存户在计划机搜集中探求效劳器时,爆发此事变。 onread:数据达到时爆发此事变。 四.serversocket和clientsocket的本领1.open本领   此本领实用于serversocket和cilentsocket举行创造贯穿,原形如次: void-fastcall open(void); 2.close本领  此本领实用于serversocket和cilentsocket举行封闭贯穿,原形如次: void-fastcall close(void); 五.编写谈天步调  翻开c++builder 5.0兴建一个工程,兴建一个form1窗体,在form1窗体中增添以次控件: clientsocket控件:1个 serversocket控件:1 个 button控件:4个 label控件:2个 memo控件:1个 edit控件:2个 treeview控件:1个 statusbar控件:1个 增添控件各控件属树立如次: form1窗体:caption="搜集谈天器". serversocket: name=serversocket1;port=10000;servertype=stnonblocking;threadcachesize=10. clientsocket: name=clientsocket1;port=10000;clienttype=stnonblocking. mome:name=mome1;scrollbars=ssvertical. treeview:name=treeview1; button: 第一个:name=btnlisten;caption="监听";第二个:name=btnconnect;caption="贯穿"; 第三个:name=btndisconnect;caption="割断";第一个:name=btnexit;caption="退出"; label:第一个:name=label1;caption="发送";第二个: name=label2;caption="在线存户". edit: 第一个:name=edit1; 第二个: name=edit2; statusbar:name=statusbar1; 树立好之上属性值,就不妨举行代码的编写了,源步调代码如次://-------------------------- //"unit1.h"的源步调 //-------------------#ifndef unit1h#define unit1h//--------------------------------------------------------------------#include <classes.hpp>#include <controls.hpp>#include <stdctrls.hpp>#include <forms.hpp>#include <scktcomp.hpp>#include <extctrls.hpp>#include <comctrls.hpp>#include <menus.hpp>#include <toolwin.hpp>//---------------------------------------------------------------------class tform1 : public tform{__published: // ide-managed componentstclientsocket *clientsocket1;tserversocket *serversocket1;tmemo *memo1;tstatusbar *statusbar1;tedit *edit1;tlabel *label1;ttreeview *treeview1;tlabel *label2;tedit *edit2;tbutton *btnlisten;tbutton *btnconnect;tbutton *btndisconnect;tbutton *btnexit;void __fastcall formcreate(tobject *sender);void __fastcall clientsocket1connect(tobject *sender,tcustomwinsocket *socket);void __fastcall serversocket1accept(tobject *sender,tcustomwinsocket *socket);void __fastcall serversocket1clientdisconnect(tobject *sender,tcustomwinsocket *socket);void __fastcall clientsocket1disconnect(tobject *sender,tcustomwinsocket *socket);void __fastcall clientsocket1error(tobject *sender,tcustomwinsocket *socket, terrorevent errorevent,int &errorcode);void __fastcall clientsocket1read(tobject *sender,tcustomwinsocket *socket);void __fastcall serversocket1clientread(tobject *sender,tcustomwinsocket *socket);void __fastcall edit1keydown(tobject *sender, word &key,tshiftstate shift);void __fastcall clientsocket1lookup(tobject *sender,tcustomwinsocket *socket);void __fastcall treeview1change(tobject *sender, ttreenode *node);void __fastcall btnlistenclick(tobject *sender);void __fastcall btnconnectclick(tobject *sender);void __fastcall btndisconnectclick(tobject *sender);void __fastcall btnexitclick(tobject *sender);private:bool isserver;string server;// user declarationspublic: // user declarations__fastcall tform1(tcomponent* owner);};//-------------------------------------------------------------------------extern package tform1 *form1;//-------------------------------------------------------------------------#endif //"unit1.cpp"源步调 //-----------------------------------------------#include <vcl.h>#include <stdio.h>#pragma hdrstop #include "unit1.h"//--------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"tform1 *form1;//--------------------------------------------------------------------------__fastcall tform1::tform1(tcomponent* owner): tform(owner){isserver=false;server="";}//--------------------------------------------------------------------------void __fastcall tform1::formcreate(tobject *sender){btndisconnect->enabled=false;} //------------------------------------------------------------------------//当用户提出贯穿乞求后,存户端会触发oncreate事变void __fastcall tform1::clientsocket1connect(tobject *sender,tcustomwinsocket *socket){statusbar1->simpletext="贯穿到:"+server;treeview1->items->add(treeview1->selected ,server);memo1->lines->clear();//设置mouse的典型form1->cursor=crdefault ;edit1->cursor=crdefault;memo1->cursor=crdefault;//爆发一个新的监听 }//-------------------------------------------------------------------------//在效劳器接收了存户的乞求后会触发onaccept事变void __fastcall tform1::serversocket1accept(tobject *sender,tcustomwinsocket *socket){ memo1->lines->clear();isserver=true;statusbar1->simpletext="贯穿到:"+socket->localhost;treeview1->items->add(treeview1->selected ,socket->localhost);}//-------------------------------------------------------------------------//割断后连接监听void __fastcall tform1::serversocket1clientdisconnect(tobject *sender,tcustomwinsocket *socket){statusbar1->simpletext="正在监听...";}//-------------------------------------------------------------------------//存户端封闭贯穿后爆发的事变void __fastcall tform1::clientsocket1disconnect(tobject *sender,tcustomwinsocket *socket){btnlisten->enabled=true;btnconnect->enabled=true;btndisconnect->enabled=false;statusbar1->simpletext="";}//-------------------------------------------------------------------------// 通讯进程中爆发缺点时爆发的事变void __fastcall tform1::clientsocket1error(tobject *sender,tcustomwinsocket *socket, terrorevent errorevent, int &errorcode){showmessage("缺点!!! 没辙贯穿到效劳器");errorcode=0;btnlisten->enabled=true;btnconnect->enabled=true;btndisconnect->enabled=false;statusbar1->simpletext="";//设置mouse的典型form1->cursor=crdefault ;edit1->cursor=crdefault;memo1->cursor=crdefault;form1->caption ="搜集谈天器";}//-------------------------------------------------------------------------//存户端接受数据void __fastcall tform1::clientsocket1read(tobject *sender,tcustomwinsocket *socket){memo1->lines->add(socket->receivetext());}//---------------------------------------------------------------------------//效劳器端接受数据void __fastcall tform1::serversocket1clientread(tobject *sender,tcustomwinsocket *socket){memo1->lines->add(socket->receivetext());}//-------------------------------------------------------------------------//在创造贯穿后,两边就不妨在edit第11中学输出说话实质发端进//行攀谈了,按下enter键后,将地方行的文本发送出去void __fastcall tform1::edit1keydown(tobject *sender, word &key,tshiftstate shift){ansistring data;if(key==vk_return){if (edit2->text!="") //在没有采用发送的长机名时不许举行发送操纵{if(isserver) //效劳器端发出的数据{data= "["+timetostr(now())+"]:("+serversocket1->socket->localhost+")对"+"("+edit2->text+")"+"说:"+edit1->text;serversocket1->socket->connections[treeview1->selected->index]->sendtext(data);memo1->lines->add(data);edit1->text="";}else //存户端发出的数据{ data="["+timetostr(now())+"]:("+clientsocket1->socket->localhost+")对"+"("+edit2->text+")"+"说:"+edit1->text;clientsocket1->socket->sendtext(data);memo1->lines->add(data);edit1->text="";}}elseshowmessage("缺点!!! 没有采用发送的长机名");}}//---------------------------------------------------------------------------//在搜集中探求效劳器端时爆发的事变void __fastcall tform1::clientsocket1lookup(tobject *sender,tcustomwinsocket *socket){ //设置mouse的典型form1->cursor=crhourglass ;edit1->cursor=crhourglass;memo1->cursor=crhourglass;}//采用发向数据的长机名void __fastcall tform1::treeview1change(tobject *sender, ttreenode *node){edit2->text=treeview1->selected->treeview->selected->text;statusbar1->simpletext="贯穿到:"+treeview1->selected->treeview->selected->text;} //监听void __fastcall tform1::btnlistenclick(tobject *sender){clientsocket1->active=false;serversocket1->active=true;statusbar1->simpletext="正在监听...";form1->caption =form1->caption+"--效劳器端";btnlisten->enabled=false;btnconnect->enabled=false;}//贯穿void __fastcall tform1::btnconnectclick(tobject *sender){if(inputquery("贯穿到效劳器","输出效劳器地方:",server)){if(server.length() >0){clientsocket1->host=server; //决定效劳器的长机名clientsocket1->active=true;btnlisten->enabled=false;btnconnect->enabled=false;btndisconnect->enabled=true;form1->caption =form1->caption+"--存户端";}}}//割断void __fastcall tform1::btndisconnectclick(tobject *sender){//按下割断clientsocket1->close();}//---------------------------------------------------------------------------//退出void __fastcall tform1::btnexitclick(tobject *sender){clientsocket1->close();serversocket1->close();form1->close();}//编写完步调代码后,就要对源步调举行编写翻译了,编写翻译本领如次: 1.在菜单 project \ options 下,采用packages 页,去掉build with runtime packages 项的勾, 而后采用linker 页,去掉 use dynamic rtl 的勾,而后按“决定”按钮。 2.在菜单 project \ options 下,采用 compiler 页,按下 release 按钮,而后按“决定”按钮。 3.在菜单 run \ run (或f9) 举行编写翻译就行。 用这种本领编写翻译的可实行文献含量比拟小, 并且不妨在没有安置c++的体例中运转。在运转时 可单机也可多机操纵,但必需要有一个长机翻开步调的“监听”,其它存户机举行贯穿就行了。 快快来载入,编写本人的谈天步调吧!

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.