基于TCP局域网聊天程序研究设计.docx

上传人:b****6 文档编号:15789662 上传时间:2023-07-07 格式:DOCX 页数:26 大小:103.54KB
下载 相关 举报
基于TCP局域网聊天程序研究设计.docx_第1页
第1页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第2页
第2页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第3页
第3页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第4页
第4页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第5页
第5页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第6页
第6页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第7页
第7页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第8页
第8页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第9页
第9页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第10页
第10页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第11页
第11页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第12页
第12页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第13页
第13页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第14页
第14页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第15页
第15页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第16页
第16页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第17页
第17页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第18页
第18页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第19页
第19页 / 共26页
基于TCP局域网聊天程序研究设计.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于TCP局域网聊天程序研究设计.docx

《基于TCP局域网聊天程序研究设计.docx》由会员分享,可在线阅读,更多相关《基于TCP局域网聊天程序研究设计.docx(26页珍藏版)》请在冰点文库上搜索。

基于TCP局域网聊天程序研究设计.docx

基于TCP局域网聊天程序研究设计

1.1系统设计要求:

1.

2.

3.

1.2系统原理框图

本次课程设计的原理框图如图1.1所示:

 

图1.1系统原理框图

1.3系统设计原理

局域网聊天程序的实现主要为局域网内的计算机提供交流的平台。

完成一个基于服务器和客户端的局域网通讯软件,类似于聊天室,可进行注册、登录、系统信息记录、聊天等功能。

用户容易使用,便于管理。

 

第二章系统设计理论基础

2.1TCP/IP协议

TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。

因此用户一般不涉及。

TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。

编程时,编程界面有两种形式:

一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。

前者为核内设计,后者为核外设计。

用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。

2.2客户机/服务器模式

C/S结构(Client/Server结构)是大家熟知的客户机和服务器结构。

它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。

这也就是目前应用系统的发展方向。

首先服务器方要启动,并根据请求提供相应服务:

(1)打开一通信通道并告知本地主机,它在某一公认地址端口上(如http为80)接受客户请求。

(2)等待客户请求到达该端口。

(3)接收到重复服务请求,处理该请求并发送应答信号。

接收并发服务请求,要激活一新进程来处理这个客户请求。

新进程处理此客户请求,并不需要对其他请求做出应答。

服务完成后,关闭此新进程与客户的通信链路,并终止。

(4)返回第二步,等待另外的客户请求

(5)关闭服务器。

客户方:

(1)打开一通信通道,并连接到服务器所在主机的特定端口。

(2)向服务器发出服务请求报文,等待并接收应答;继续提出请求。

(3)请求结束后关闭通信通道并终止。

从上面的描述过程可知:

(1)客户与服务器进程的作用是非对称的。

因此编码不同。

(2)服务进程一般是先于客户请求启动的。

只要系统运行,该进程一直存在,直到正常终止或者强迫终止。

在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。

该模式的建立基于以下两点:

1、非对等作用;2、通信完全是异步的。

2.3Socket

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的描述发给客户端,一旦客户端确认了此描述,连接就建立了。

在本文中的聊天程序用的就是监听连接,即服务器设置连接个数后进行监听,客户端进行对服务器端的连接,这样就可以进行相互通信了。

 

第三章系统设计

3.1系统设计目标

局域网聊天程序的设计目标为一个高性能的,易于使用的,面向局域网的即时信息软件。

最终的程序应具有如下功能:

(1)客户端使用简便,服务器端运行稳定。

客户端与服务器端可运行在多种系统平台,具有良好的兼容性能。

(2)客户端与服务器端功能独立,可独立运行在不同的计算机上或运行在同一台计算机上,具有最大的灵活性。

(3)能够进行注册,设置自己的用户名和密码,自动更新其他用户的名单。

(4)选择特定用户并与其交谈,还可以向在所有在线的用户发送消息。

3.2客户端设计

客户端设计界面图为:

 

 

图3.1聊天客户端界面图

从聊天客户端界面图知道设计步骤为:

添加一个客户端socket控件(ClientSocket)到form中使之成为一个TCP/IP客户。

客户sockets允许你指定你想连接的服务器socket和你希望服务器提供的服务。

一但你描述你想得到的连接,你可以使用客户socket控件去完成连接服务。

  

 每个客户socket控件使用独立的客户windowssocket对象(TClientWinSocket)去应答连接中的客户终端。

使用客户sockets去:

A.指定想得到的服务  

 客户socket控件有一个数字properties,允许你指定想连接的服务器系统和端口。

可以通过主机名来指定服务器系统,使用Hostproperty。

  

 如果不知道主机名,或者关心找到服务器的速度,你可以指定服务器系统的IP地址,通过使用Address property。

你必须指定IP地址和主机名中的一个。

  

 如果两个都指定,客户socket控件将使用主机名。

除服务器系统外,必须指定客户socket将连接的在服务器系统上的端口。

能够直接使用Portproperty来指定服务端口号。

或者直接在Service property使用想得到的服务的名字。

如果指定端口号和服务名,客户socket控件将使用服务名。

  

   B.建立连接  

 一旦在客户socket控件中完成了设置所连接的服务器的属性,就可以进行连接,通过调用Open方法。

如果想要启动时自动建立连接,在设计时设置Active property为true,通过使用ObjectInspector来设置。

C.取得关于连接的信息  

 完成连接到服务器socket后,可以使用客户socket控件和相关的客户windowssocketobject去取得关于连接的信息。

使用Socketproperty去访问clientwindowssocketobject。

windows socket object有一个properties,它能让你确定在连接的两端客户和服务器使用的地址和端口号。

  

 当使用一个windowssocketAPI调用时,可以使用SocketHandle property区获得socket连接使用的handle。

可以使用Handleproperty去访问windows,以便接收来自socket连接的信息。

AsyncStylesproperty决定哪种信息类型是windows handle要接收的。

D.关闭连接  

 当完成通讯想关闭socket连接时,能够通过调用Close方法来关闭连接。

连接可能要由服务器端来关闭。

如果是这种情况,将收到一个OnDisconnect事件的通知。

  

  聊天客户端程序代码如下:

procedureTForm1.Button1Click(Sender:

TObject);

begin

clientsocket1.Address:

=edit3.Text;

//edit3.Clear;

clientsocket1.Active:

=true;

button1.Enabled:

=false;

button3.Enabled:

=true;

button2.Enabled:

=true;

button7.Enabled:

=true;

end;

procedureTForm1.ClientSocket1Connecting(Sender:

TObject;

Socket:

TCustomWinSocket);

begin

statusbar1.SimpleText:

='正在连接...'+clientsocket1.Address;

end;

procedureTForm1.ClientSocket1Connect(Sender:

TObject;

Socket:

TCustomWinSocket);

begin

statusbar1.SimpleText:

='连接到'+clientsocket1.Address;

end;

procedureTForm1.Button4Click(Sender:

TObject);

begin

close;

end;

procedureTForm1.Button3Click(Sender:

TObject);

begin

ifclientsocket1.Activethen

begin

clientsocket1.Socket.SendText(usename+'*^&%#^)@');

clientsocket1.Active:

=false;

end;

statusbar1.SimpleText:

='断开连接';

edit1.Enabled:

=true;

edit2.Enabled:

=true;

button1.Enabled:

=true;

button6.Enabled:

=true;

memo1.Clear;

listbox1.Clear;

end;

procedureTForm1.Edit4KeyPress(Sender:

TObject;varKey:

Char);

begin

ifkey=#13then

ifbutton6.Enabledthen

button6.Click;

end;

procedureTForm1.Button6Click(Sender:

TObject);

var

chatname:

string;

i:

integer;

begin

ifedit4.Text=''then

begin

showmessage('发送消息不能为空!

');

exit;

end;

ifradiobutton2.Checked=truethen

begin

fori:

=0tolistbox1.items.countdo

begin

iflistbox1.selected[i]then

begin

chatname:

=listbox1.items.strings[i];

memo1.lines.add('你对'+chatname+'悄悄说:

'+edit4.Text);

//edit4.Clear;

break;

end

end;

clientsocket1.Socket.SendText(edit4.Text+'&&'+chatname+'$$'+usename+'%&%&%&');

edit4.Clear;

end

else

begin

clientsocket1.Socket.SendText(edit1.Text+'对大家说:

'+edit4.Text);

edit4.Clear;

end;

end;

procedureTForm1.Button2Click(Sender:

TObject);

begin

ifedit1.Text=''then

begin

showmessage('请输入用户名!

');

edit1.SetFocus;

exit;

end;

ifedit2.Text=''then

begin

showmessage('请输入密码!

');

edit2.SetFocus;

exit;

end;

clientsocket1.Socket.SendText(edit1.Text+'$%$%$%');

usename:

=edit1.Text;

password:

=edit2.Text;

end;

procedureTForm1.ClientSocket1Read(Sender:

TObject;

Socket:

TCustomWinSocket);

var

temptext:

string;

//chatname:

string;

mssge:

string;

begin

temptext:

=clientsocket1.Socket.ReceiveText;

ifpos('@#$%^&',temptext)<>0then//回送密码

begin

temptext:

=copy(temptext,1,length(temptext)-6);

iftemptext=passwordthen

begin

Memo1.Lines.Add('登陆成功,欢迎进入本聊天室!

');

listbox1.Items.Add(usename);

button6.Enabled:

=true;

button2.Enabled:

=false;

edit1.Enabled:

=false;

edit2.Enabled:

=false;

button7.Enabled:

=true;

endelse

begin

showmessage('密码错误,登陆失败,请检查后重新登陆!

');

clientsocket1.Socket.SendText(usename+'*^&%#^)@');

end

end

elseifpos('~{}()&*%^',temptext)<>0then//他人登陆信息

begin

temptext:

=copy(temptext,1,length(temptext)-9);

iftemptext<>edit1.Textthen

begin

memo1.Lines.Add(temptext+'进入聊天室...');

listbox1.Items.add(temptext);

end;

end

elseifpos('^$%#^$',temptext)<>0then//offline

begin

temptext:

=copy(temptext,1,length(temptext)-6);

memo1.Lines.Add(temptext+'离开聊天室...');

//showmessage(inttostr(listbox1.Items.IndexOf(temptext)));

iflistbox1.Items.IndexOf(temptext)<>-1then

listbox1.Items.Delete(listbox1.Items.IndexOf(temptext));

end

elseifpos('#$%^&*{}',temptext)<>0then

begin

mssge:

=copy(temptext,1,length(temptext)-8);

memo1.Lines.Add(mssge);

end

else

memo1.Lines.Add(temptext);

end;

procedureTForm1.Button7Click(Sender:

TObject);

begin

form2.ShowModal;

end;

procedureTForm1.Button5Click(Sender:

TObject);

begin

memo1.Clear;

end;

procedureTForm1.FormClose(Sender:

TObject;varAction:

TCloseAction);

begin

ifclientsocket1.Activethen

begin

clientsocket1.Socket.SendText(usename+'*^&%#^)@');

clientsocket1.Active:

=false;

end;

end;

procedureTForm1.Memo1Change(Sender:

TObject);

begin

end;

end.

 

3.3服务器端设计

服务器端设计界面图为:

 

图3.2聊天服务器界面图

从聊天服务器端界面图知道设计步骤为:

 

 添加一个服务端socket控件(ServerSocket)到form中使之成为一个TCP/IP服务器。

服务器sockets允许指定想提供的服务或想用来监听客户请求时使用的端口。

也可以使用服务器socket控件去监听和允许客户连接请求。

每个服务器socket控件使用一个单一的服务器windowssocketObject(TServerWinSocket)去应答在服务器端监听到的连接。

它通常使用一个服务器客户winodwssocketObject(TServerClientWinSocket)应答在服务器端每个活动的,连接着得到允许服务的客户socket。

使用服务器sockets去:

A.指定端口  

 在服务器socket能够监听客户请求之前,必须指定一个端口给你的监听服务。

可以使用Portproperty来指定这个端口。

如果服务器应用提供一个标准的服务,这个服务使用一个习惯使用的相关联的端口。

能够使用Serviceproperty直接指定端口号。

使用Service property是一个好的主意,能够减少设置端口号时的错误。

如果既指定了Portproperty,又指定了Serviceproperty,服务socket将使用服务名。

B.监听客户请求

一旦在serversocket控件上设置好了端口号,就能够通过在运行时通过调用Open方法来监听一个连接。

如果希望应用程序能够在启动的时候自动监听连接,在设计的时候通过使用ObjectInspector设置Active属性为true。

C.连接到客户端  

 当监听服务socket控件接收到一个客户端连接请求时他们将自动接受这个请求。

当没次收到通知时,OnClientConnetc事件将发生。

  

D.取得关于连接的信息  

 一但服务器socket打开了监听连接,就能够使用与服务器socket控件相关联的服务器windowssocketobject来取得关于连接的信息。

使用Socketproperty去访问serverwindowssocketobject.windowssocketobject有一个属性是关于所有活动的客户socket连接这些客户socket是通过服务器socket控件允许连接的。

使用Handle属性去存取windows通过socket连接收到的信息。

  

 每个活动的,连接到客户应用是通过服务、客户windowssocketbject(TServerClientWinSocket)封装的。

你能够通过serverwindowssocketobject的连接属性来访问所有的这些。

这些serverclientwindowssocketobject有些属性能够决定哪些地址和端口号给连接的两端--客户和服务器socket使用。

当使用windowssocketAPI调用时,可以使用SocketHandle属性去获得socket连接使用的handle。

也可以使用Handle属性去访问windows从socket连接处得来的信息。

AsyncStyles属性决定windowshandle将接收哪种类型的信息。

E.关闭连接  

 当决定关闭监听连接时,调用Close方法。

这将关闭所有打开着的,连接到客户应用的连接,取消任何尚未同意的连接,接着关闭监听连接以便服务socket控件不在接受任何新的连接。

当客户端关闭他们自己独立的连接到的serversocket的连接时,可以在OnClientDisconnect事件中得到讯息。

聊天服务器端程序代码如下:

procedureTForm1.ServerSocket1Listen(Sender:

TObject;

Socket:

TCustomWinSocket);

begin

statusbar1.SimpleText:

='监听状态...';

counter:

=0;

end;

procedureTForm1.ServerSocket1ClientDisconnect(Sender:

TObject;

Socket:

TCustomWinSocket);

begin

statusbar1.SimpleText:

='连接到'+socket.RemoteAddress;

end;

procedureTForm1.ServerSocket1ClientConnect(Sender:

TObject;

Socket:

TCustomWinSocket);

begin

statusbar1.SimpleText:

=Socket.RemoteAddress+'已连接';

end;

procedureTForm1.ServerSocket1ClientRead(Sender:

TObject;

Socket:

TCustomWinSocket);

var

tmptext:

string;

check:

string;

i,j:

integer;

chattext:

string;

signpos:

integer;

member:

string;

usename:

string;

begin

tmptext:

=socket.ReceiveText;

ifpos('%&%&%&',tmptext)<>0then//当有'%&%&%&'字符串时表示私聊

begin

tmptext:

=copy(tmptext,1,length(tmptext)-6);

signpos:

=pos('&&',tmptext);

chattext:

=copy(tmptext,1,signpos-1);

member:

=copy(tmptex

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2