基于TCP的简单一对一聊天程序设计Word文档格式.docx
- 文档编号:8583162
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:14
- 大小:85.12KB
基于TCP的简单一对一聊天程序设计Word文档格式.docx
《基于TCP的简单一对一聊天程序设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于TCP的简单一对一聊天程序设计Word文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
协议,本地地址,本地端口号,远地地址,远地端口号
这样一个五元组,叫做一个相关association,即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。
在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Servermodel),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。
客户/服务器模式的建立基于以下两点:
首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。
其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基涌纪纪户/服务器模式的TCP/IP。
四.设计方案:
设计原理图:
解决方案
基于TCP连接Socket聊天程序
基于该连接的聊天程序需要至少具备一个服务器端(Server)和一个客户端(Client)。
在本程序中,一个用户作为Server端,另一个用户作为Client端。
也就是说,作为Server端的用户,需要首先启动程序,等待Client端的连接请求。
当TCP连接握手以后,双方方可进行交互。
在本程序中Server端并不是单独存在。
它也可以向他的Client端发送消息。
当Client端与Server端握手以后,Server端需要首先发起会话;
Client端在收到消息后再回复一条消息给Server端;
同样,Server端在收到消息后再回复一条消息给Client端……以此类推。
五.程序编写:
Server.h代码如下:
#include<
Afxwin.h>
stdio.h>
winsock2.h>
conio.h>
#include<
list>
iostream>
usingnamespacestd;
classCChatServer
{
public:
CChatServer();
~CChatServer();
boolIsConnected(){returnm_bIsConnected;
}//返回连接状态
voidStartListenClient();
//Listentoclient
intSendMessagePort(stringsMessage);
//向所有客户端发消息
intRecClient(SOCKETsRecSocket);
//接收客户端数据
private:
boolm_bIsConnected;
//true-connectedfalse-notconnected
intm_iServerPort;
list<
SOCKET>
m_vClientList;
//Allsocketconnectedtoclient
SOCKETm_SClient;
SOCKETm_SListenClient;
//socketlisteningforclientcalls
};
Server.cpp代码如下:
#include"
server.h"
CChatServerCServerObj;
UINTServerRecThread(LPVOIDpParam)//接收数据的工作线程
{
SOCKETsRecSocket=(SOCKET)pParam;
while
(1)
{
if(CServerObj.RecClient(sRecSocket))
break;
}
return0;
}
UINTServerListenThread(LPVOIDpParam)//监听端口建立连接的工作线程
CServerObj.StartListenClient();
CChatServer:
:
CChatServer()//对象CChatServer的构造函数
cout<
<
"
StartingupTCPChatserver\n"
;
m_bIsConnected=false;
WSADATAwsaData;
sockaddr_inlocal;
intwsaret=WSAStartup(0x101,&
wsaData);
//应用程序调用的第一个WindowsSockets函数.
//它允许应用程序或DLL指明WindowsSocketsAPI的版本号及获得特定WindowsSockets实现的细节.
if(wsaret!
=0)
return;
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)8084);
m_SListenClient=socket(AF_INET,SOCK_STREAM,0);
//创建一个套接字,返回套接字描述字
if(m_SListenClient==INVALID_SOCKET)
if(bind(m_SListenClient,(sockaddr*)&
local,sizeof(local))!
=0)//把本地协议的地址赋予一个套接字
if(listen(m_SListenClient,10)!
=0)//监听该端口
m_bIsConnected=true;
~CChatServer()//对象CChatServer的析构函数
closesocket(m_SListenClient);
//关闭该端口
WSACleanup();
voidCChatServer:
StartListenClient()
sockaddr_infrom;
intfromlen=sizeof(from);
m_SClient=accept(m_SListenClient,
(structsockaddr*)&
from,&
fromlen);
//产生与客户进行TCP连接通信的套接字并返回已连接客户端的协议地址
if(m_SClient!
=INVALID_SOCKET)
m_vClientList.push_back(m_SClient);
AfxBeginThread(ServerRecThread,(void*)m_SClient);
//启动接收线程,用m_SClient套接字与客户端通话
intCChatServer:
SendMessagePort(stringsMessage)//向各个客户端发送服务器数据
intiStat=0;
list<
iteratoritl;
if(m_vClientList.size()==0)
return0;
for(itl=m_vClientList.begin();
itl!
=m_vClientList.end();
itl++)
{
iStat=send(*itl,sMessage.c_str(),sMessage.size()+1,0);
if(iStat==-1)
m_vClientList.remove(*itl);
}
if(iStat==-1)
return1;
return0;
RecClient(SOCKETsRecSocket)//接收客户端数据成员函数
chartemp[4096];
intiStat;
iStat=recv(sRecSocket,temp,4096,0);
m_vClientList.remove(sRecSocket);
else
cout<
"
temp<
\n"
SendMessagePort(temp);
intmain(intargc,char*argv[])
intnRetCode=0;
charbuf[4096];
Thisaplicationactasachatserver.\n"
Messagesfromanypcwillbebroadcastedtoallconnectedpcs.\n"
Connecttotheserverpcport8084\n"
PressONLYENTERtoquit.\n"
=================================================\n"
if(!
CServerObj.IsConnected())//判断监听端口是否建立
cout<
\nFailedtoinitialiseserversocket"
\nBye"
getch();
return1;
AfxBeginThread(ServerListenThread,0);
//启动监听端口建立连接的工作线程
while(gets(buf))
if(strlen(buf)==0)
if(CServerObj.SendMessagePort(buf))
cout<
Probleminconnectingtoserver.Checkwhetherserverisrunning\n"
cout<
readytoseegoodbye:
getch();
returnnRetCode;
Client.h
classCIPMessage
CIPMessage();
~CIPMessage();
voidInit(stringsIpAddress,intiPort);
intRecMessagePort();
stringm_sServerIPAddress;
SOCKETconn;
//socketconnectedtoserver
Client.cpp代码如下:
client.h"
//GlobalMessageobject
CIPMessageMyMessObj;
CIPMessage:
CIPMessage()//MyMessObj构造函数
voidCIPMessage:
Init(stringsIpAddress,intiPort)//建立与服务器端得连接
m_sServerIPAddress=sIpAddress;
m_iServerPort=iPort;
structhostent*hp;
unsignedintaddr;
structsockaddr_inserver;
return;
conn=socket(AF_INET,SOCK_STREAM,0);
//建立客户端套接字
if(conn==INVALID_SOCKET)
addr=inet_addr(m_sServerIPAddress.c_str());
//转化ip地址和端口为指定形式
hp=gethostbyaddr((char*)&
addr,sizeof(addr),AF_INET);
if(hp==NULL)
closesocket(conn);
server.sin_addr.s_addr=*((unsignedlong*)hp->
h_addr);
server.sin_family=AF_INET;
server.sin_port=htons(m_iServerPort);
if(connect(conn,(structsockaddr*)&
server,sizeof(server)))//向指定服务器建立连接
~CIPMessage()//MyMessObj析构函数
if(m_bIsConnected)
intCIPMessage:
SendMessagePort(stringsMessage)//向指定服务器发出数据
iStat=send(conn,sMessage.c_str(),sMessage.size()+1,0);
RecMessagePort()//接收指定服务器数据
characRetData[4096];
iStat=recv(conn,acRetData,4096,0);
-->
acRetData<
UINTMessageRecThread(LPVOIDpParam)//接收指定服务器数据线程
if(MyMessObj.RecMessagePort())
ThisisaclientTCP/IPapplication\nConnectingtoport8084\n"
\nPressONLYENTERtoquit"
\n===============================================\n"
FILE*fp=fopen("
server.ini"
"
r"
);
//获取服务器端套接字地址
if(fp==NULL)
\nUnabletoopenserver.ini.PleasespecifyserverIPsddressinserver.ini"
//mainfailed
stringsServerAddress;
while((fgets(buf,4096,fp))!
=NULL)
if(buf[0]=='
#'
)
continue;
sServerAddress=buf;
fclose(fp);
if(sServerAddress.size()==0)
\nUnabletofindserverIPaddressinserver.ini"
\nPleasesetserverIPaddress"
\nBYEBYE:
MyMessObj.Init(sServerAddress.c_str(),8084);
//启动与服务器连接
MyMessObj.IsConnected())
\nUnabletoconnecttotheIPaddressspecifiedinserver.ini"
\nPleasecheckserverIPaddress"
\nreadytoseegoodbye:
AfxBeginThread(MessageRecThread,0);
//开启接收数据线程
if(MyMessObj.SendMessagePort(buf))//向服务器发送数据
\nreadytoseegoodbye:
}
server.inc代码如下:
127.0.0.1//实现本机通信,另外,可通过更改套接字来实现异机通信.
六.结果运行与截图:
服务器和客户端是一台电脑的两个进程
服务器和客户端分别部署在两台电脑上时,一台是服务器,另一台客户端需要将服务器配置文件server.inc修改成服务器的IP地址。
七.实习心得和体会:
经过一周的实习,加深了对计算机网络的了解。
在做一对一来聊天程序时自己查阅很多资料,对socket有了更多的了解。
同时还加深了对server/client模式还有TCP三次握手的学习,将理论运用到的实践中,并且自己学习“孙鑫C++视频教程”中的网络编程部分,学会了线程的应用和TCP与UDP关于socket聊天编程上的不同。
除此之外对socket格式、ip和Windows套接字在两种模式下执行I/O操作,阻塞和非阻塞等其他的知识进行了学习。
总之,这次实习是在与同学一起合作下完成的,加强了团队合作精神,复习所学知识且运用到了实践中,并且自学了很多的东西,这次实习经历是我以后生活和学习中的财富。
XXXXX大学
XXXXXX学院
计算机网络与通信实习报告
设计题目基于TCP的简单一对一聊天程序设计
学生专业班级
学生姓名(学号)
指导教师
完成时间2010年5月25日
实习(设计)地点机房139
2010年5月25日
课程设计成绩评定表
学生姓名
专业班级
设计题目
基于TCP的简单一对一聊天程序设计
指导教师评语及意见:
指导教师评阅成绩:
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TCP 简单 一对一 聊天 程序设计