基于TCP的简单一对一聊天程序的设计说明Word文档格式.docx
《基于TCP的简单一对一聊天程序的设计说明Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于TCP的简单一对一聊天程序的设计说明Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
在对称的协议中,每一方都有可能扮演主从角色;
在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。
无论具体的协议是对称的或是非对称的,当服务被提供时必然存在"
客户进程"
和"
服务进程"
。
一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。
在这个时刻,服务程序被"
惊醒"
并且为客户提供服务-对客户的请求作出适当的反应。
虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。
相关协议。
应用到的网络协议主要有TCP协议。
TCP协议被称作一种端对端协议。
这是因为它为两台计算机之间的连接起了重要作用:
当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。
传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。
即使在Internet暂时出现堵塞的情况下,TCP也能够保证通信的可靠。
IP协议只保证计算机能发送和接收分组资料,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。
三、设计方案
首先本程序的定位是一对一的聊天程序;
程序没有采用图形界面;
程序的设计语言采用的是C++;
基于winsock;
开发工具为VC++。
聊天程序的设计可以采用UDP或者TCP,程序采用TCP。
采用的是客户服务器模型。
在本程序中,一个用户作为Server端,另一个用户作为Client端。
也就是说,作为Server端的用户,需要首先启动程序,等待Client端的连接请求。
Client端自动建立连接请求。
当TCP连接握手以后,双方方可进行交互。
在客户端用户进行消息的编写,发送和接受等功能;
而服务器端发送的消息向客户端所有的用户进行发送可以称之为系统消息;
服务器端收到某一个用户发送的消息之后可以向所有的其它用户进行转发。
连接断开之后,断开服务的客户端将不能够收到服务器转发的消息。
程序可在同台机器上或者是不同机器上运行。
在用C++语言进行代码的编写时主要应用到的是C++中的网络编程、输入输出处理、多线程以技术。
数据的传输使用的是I/O输入输出处理,用到类似cout<
<
"
string"
;
等的输出处理方法。
因为服务器是一只提供服务的,也就是说服务器一直是运行的状态,时刻等待着新的客户端提出连接请求,所以就需要使用到多线程的方法。
Socket类的实例的accept方法是一个阻塞式的方法,如果只是用进程来表示新的客户端,那么在现有进程没有结束的情况下,新的客户端在发送连接请求之后程序将不能继续向下执行,所以应该应用比进程更小的线程来解决这一问题。
四、程序编写
1、客户端与服务器端用到的相关类
classCIPMessage
{
public:
CIPMessage();
~CIPMessage();
voidInit(stringsIpAddress,intiPort);
intSendMessagePort(stringsMessage);
intRecMessagePort();
boolIsConnected(){returnm_bIsConnected;
}
private:
boolm_bIsConnected;
//true-connectedfalse-notconnected
stringm_sServerIPAddress;
intm_iServerPort;
SOCKETconn;
//socketconnectedtoserver
};
classCChatServer
CChatServer();
~CChatServer();
}//返回连接状态
voidStartListenClient();
//Listentoclient
//向所有客户端发消息
intRecClient(SOCKETsRecSocket);
//接收客户端数据
list<
SOCKET>
m_vClientList;
//Allsocketconnectedtoclient
SOCKETm_SClient;
SOCKETm_SListenClient;
//socketlisteningforclientcalls
2、服务器端程序
#include"
server.h"
CChatServerCServerObj;
UINTServerRecThread(LPVOIDpParam)//接收数据的工作线程
{
.............
UINTServerListenThread(LPVOIDpParam)//监听端口建立连接的工作线程
CChatServer:
:
CChatServer()//对象CChatServer的构造函数
...........
m_SListenClient=socket(AF_INET,SOCK_STREAM,0);
//创建一个套接字,返回套接字描述字
..............
if(bind(m_SListenClient,(sockaddr*)&
local,sizeof(local))!
=0)//把本地协议的地址赋予一个套接字
if(listen(m_SListenClient,10)!
=0)//监听该端口
~CChatServer()//对象CChatServer的析构函数
closesocket(m_SListenClient);
//关闭该端口
WSACleanup();
voidCChatServer:
StartListenClient()
m_SClient=accept(m_SListenClient,
(structsockaddr*)&
from,&
fromlen);
//产生与客户进行TCP连接通信的套接字并返回已连接客户端的协议地址
.............
AfxBeginThread(ServerRecThread,(void*)m_SClient);
//启动接收线程,用m_SClient套接字与客户端通话
intCChatServer:
SendMessagePort(stringsMessage)//向各个客户端发送服务器数据
......
for(itl=m_vClientList.begin();
itl!
=m_vClientList.end();
itl++)
{
iStat=send(*itl,sMessage.c_str(),sMessage.size()+1,0);
}
............
RecClient(SOCKETsRecSocket)//接收客户端数据成员函数
.............
iStat=recv(sRecSocket,temp,4096,0);
if(iStat==-1)
else
SendMessagePort(temp);
..........
return0;
intmain(intargc,char*argv[])
if(!
CServerObj.IsConnected())//判断监听端口是否建立
{
...........
}
AfxBeginThread(ServerListenThread,0);
//启动监听端口建立连接的工作线程
while(gets(buf))
........
if(CServerObj.SendMessagePort(buf))
.............
3、客户端程序
client.h"
//GlobalMessageobject
CIPMessageMyMessObj;
CIPMessage:
CIPMessage()//MyMessObj构造函数
voidCIPMessage:
Init(stringsIpAddress,intiPort)//建立与服务器端得连接
................
conn=socket(AF_INET,SOCK_STREAM,0);
//建立客户端套接字
addr=inet_addr(m_sServerIPAddress.c_str());
//转化ip地址和端口为指定形式
hp=gethostbyaddr((char*)&
addr,sizeof(addr),AF_INET);
..........
if(connect(conn,(structsockaddr*)&
server,sizeof(server)))//向指定服务器建立连接
m_bIsConnected=true;
return;
~CIPMessage()//MyMessObj析构函数
intCIPMessage:
SendMessagePort(stringsMessage)//向指定服务器发出数据
iStat=send(conn,sMessage.c_str(),sMessage.size()+1,0);
RecMessagePort()//接收指定服务器数据
..........
iStat=recv(conn,acRetData,4096,0);
UINTMessageRecThread(LPVOIDpParam)//接收指定服务器数据线程
..............
FILE*fp=fopen("
server.ini"
"
r"
);
//获取服务器端套接字地址
.............
while((fgets(buf,4096,fp))!
=NULL)
........
sServerAddress=buf;
fclose(fp);
...............
MyMessObj.Init(sServerAddress.c_str(),8084);
//启动与服务器连接
AfxBeginThread(MessageRecThread,0);
//开启接收数据线程
.........
if(MyMessObj.SendMessagePort(buf))//向服务器发送数据
五、运行结果
测试时在同一机器上运行的,有一个服务器和两个客户端。
上图为服务器端程序运行结果
客户端运行结果
六、实习心得和体会
通过本次计算机网络课程设计,我对计算机网络这门课有了更深入的理解与认识。
了解了winsock编程技术,对于TCP协议有了更深入的理解。
我明白了对网络通讯程序的设计的原理和过程的透彻理解,是网络通讯程序的前提。
我在代码编写的时候,使用了集成开发工具vc++,所以编程的效率相对较高。
这个聊天程序只是实现了基本的功能,而且并没有提供较为友好的图形界面。
通常,网络应用程序包含两个独立的应用程序:
客户程序和服务器程序。
但是,也可以设计同时完成这两种功能的程序,例如,一些服务器程序如果不能完成一个服务请求时,它将转而充当客户程序,向其它服务器程序请求信息。
通过这次的课程设计,我明白了很多。
我知道自己在实践动手能力方面还有很大欠缺,做出能够聊天的程序增加了我对网络编程的兴趣。
我也认识到了自己在编程方面的很多不足,对整个协议栈的了解还不太清晰,以后得总结一下这方面的知识。
我会更加努力,平时注重提高自己的实践动手能力,争取更大的进步。
参考文献
[1]谢希仁.计算机网络(第5版).北京:
电子工业.
[2]钱能.C++程序设计教程.北京:
清华大学.
[3]鸣,计算机网络实践教程,机械工业.
[4]曹丽娜通信原理(第六版)国防大学
实习报告
设计题目基于TCP的简单一对一聊天程序设计
学生专业班级
学生(学号)
指导教师
完成时间2010年5月25日
实习(设计)地点机房
2010年5月25日
课程设计成绩评定表
学生
专业班级
设计题目
基于TCP的简单一对一聊天程序设计
指导教师评语及意见:
指导教师评阅成绩:
指导教师签字:
年月日