局域网实时通讯工具c++builder.docx
《局域网实时通讯工具c++builder.docx》由会员分享,可在线阅读,更多相关《局域网实时通讯工具c++builder.docx(39页珍藏版)》请在冰豆网上搜索。
![局域网实时通讯工具c++builder.docx](https://file1.bdocx.com/fileroot1/2022-11/18/01c1ebfa-d87f-4229-8289-fe700e283155/01c1ebfa-d87f-4229-8289-fe700e2831551.gif)
局域网实时通讯工具c++builder
计算机与信息学院
《计算机网络系统实践》报告
2009年9月
一、设计要求
1.熟悉WinSockAPI主要函数的使用;
2.掌握相应开发工具对WindowsSocketAPI的封装;
3.制作基于局域网的一对一网络即时通讯工具,实现基本数据的网络传输。
二、开发环境与工具
WindowsxpC++builder
三、设计原理
网络通讯的基础是套接字Socket.Socket是通信端点的一种概念抽象。
它提供了相连的各个通讯端点通过网络进行数据发送和接收机制。
WindowsSockets规范是一套开放的,支持多种协议的Windows操作系统下的网络编程API。
Socket接口是TCP/IP网络通信的API。
也就是说,Socket接口规定了许多函数和例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
今天,Socket接口是TCP/IP网络通信最为通用的API之一。
Socket接口概念
1.网间进程通信
网间进程通信要解决的是不同主机进程间的相互通信问题。
为此,首先要解决的是网络进程标示问题。
同一主机上,不同的进程号不能惟一表示该进程。
其次,操作系统支持的网络协议众多,不同的协议的工作方式不同,地址格式也不同。
因此,网间通信还要解决多重协议的识别问题。
端口
网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。
地址
网络通信中的两个进程分别在不同的机器上。
在互联网络中,两台机器可能位于不同的网络,这些网络通过互连设备连接。
因此需要三级寻址
(1)某一主机可以与多个网络相联,必须指定一特定网络地址;
(2)网络上每一台主机应有其惟一的地址
(3)每一主机上的每一个进程应有在该主机上的惟一标志。
网络字节顺序
不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放地位字节,有的存高位字节。
连接
两个进程间的通讯链路称为连接。
半相关
网络中用一个三元组可以在全局惟一标志一个进程。
全相关
一个完整的网络通信需要两个进程组成,并且只使用同一种高层协议。
2.服务方式
面向连接和无连接方式
面向连接服务中每一次完整的数据传输都要经过建立连接,使用连接终止连接的过程无连接服务中每个数据报都携带完整的目的地址,各数据报在系统中独立传输。
顺序差错控制流控制字节流数据报缓冲紧急数据
3客户服务器模式
4套接字类型
流式套接字数据报式套接字原始式套接字
服务器端流程图
客户端流程图
四系统功能描述及软件模块划分
服务器设计
网络聊天的基础是TCP/IP协议,服务器把程序转换成一个虚拟的TCP/IP服务器,并且和指定的客户端建立连接后,成功后向指定的客户端建立连接,在连接成功后想指定的客户端发出连接信号,在连接成功后,向指定的服务器发出信号。
(1)serversocket组件位于组件模版的internet标签页下,使用时直接拖动Form1即可,在使用serversocket组件时,必须设置serversocket的端口号。
它与客户端进行通信与连接的通道,客户端必须以相同的端口号才能连接。
(2)在serversocket组件需要重新设置端口号时,应该首先断开与客户端的链接,然后再设置端口号再重新连接。
(3)如果需要使用serversocket组件发送信息,直接使用其方法sendtxt()即可,
(4)当serversocket组件收到客户端发来的信息是,它会启用onclientread事件。
要显示相应的内容是,需要自行处理该事件。
聊天客户端设计
(1)Clientsocket组件位于组件模版的internet标签页下,使用时直接拖动Form1即可,在使用Clientsocket组件时,必须设置Clientsocket的端口号。
这个端口号必须与服务器设置的端口号一致,否则它不能与服务器进行连接,并且需要设置连接服务器的IP地址。
(2)Clientsocket组件需要重新与其他服务器连接时,应该首先断开与原服务器的链接。
然后再设置端口号和服务器IP地址并重新连接。
在活动状态时不容许连接新的服务器地址。
(3)Clientsocket组件与服务器连接成功时,会产生OnConnect事件,可以处理该事件的相关内容。
(4)如果需要使用Clientsocket组件发送消息时,直接使用其方法sendtxt()即可。
五设计步骤
服务器端
通信端口
void__fastcallTForm1:
:
Label1Click(TObject*Sender)
{}
Serversocket
void__fastcallTForm1:
:
ServerSocket1Accept(TObject*Sender,
TCustomWinSocket*Socket)
{}
监听
//---------------------------------------------------------------------------
#include
#pragmahdrstop
#include"Unit1.h"
//---------------------------------------------------------------------------
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
TForm1*Form1;
//---------------------------------------------------------------------------
__fastcallTForm1:
:
TForm1(TComponent*Owner)
:
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
Button1Click(TObject*Sender)
{
ServerSocket1->Port=StrToInt(Edit1->Text);
ServerSocket1->Active=true;
ShowMessage("正在监听客户端连接状态.....");
Memo1->Lines->Clear();
Memo2->Lines->Clear();
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
Button2Click(TObject*Sender)
{
ServerSocket1->Close();
ShowMessage("已经和客户端断开了连接....");
Memo1->Clear();
Memo2->Clear();
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
Button3Click(TObject*Sender)
{
ServerSocket1->Socket->Connections[0]->SendText(Memo2->Text);
//ServerSocket1->Socket->SendText(Memo2->Text);
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
ServerSocket1ClientRead(TObject*Sender,
TCustomWinSocket*Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
Button4Click(TObject*Sender)
{
ServerSocket1->Active=false;
Form1->Close();
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
ServerSocket1ClientDisconnect(TObject*Sender,
TCustomWinSocket*Socket)
{
ShowMessage("客户端已经请求断开连接...");
Memo1->Clear();
Memo2->Clear();
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
Button6Click(TObject*Sender)
{
Memo1->Clear();
Memo1->SetFocus();
Memo2->Clear();
Memo2->SetFocus();
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
Label1Click(TObject*Sender)
{
}
//---------------------------------------------------------------------------
void__fastcallTForm1:
:
ServerSocket1Accept(TObject*Sender,
TCustomWinSocket*Socket)
{}
断开
//---------------------------------------------------------------------------
#include
#pragmahdrstop
#include"Unit1.h"
//---------------------------------------------------------------------------
#pragmapackage(smart_init)
#pragmaresource"*.dfm"
TForm1*Form1;
//---------------------------------------------------------------------------
__fastcallTFor