当前位置: 首页 > news >正文

网站商城系统设计不花钱网站推广

网站商城系统设计,不花钱网站推广,娄底网站建设公司,中国企业报集团是央企吗文章目录 前言一、补充内容,设置显示框换行二、客户端编程三、封装消息发送函数四、所处的身份状态总结 前言 C打造局域网聊天室第十课: 客户端编程及数据发送 一、补充内容,设置显示框换行 编辑框的显示内容默认是不会换行的,这…

文章目录

  • 前言
  • 一、补充内容,设置显示框换行
  • 二、客户端编程
  • 三、封装消息发送函数
  • 四、所处的身份状态
  • 总结


前言

C++打造局域网聊天室第十课: 客户端编程及数据发送


一、补充内容,设置显示框换行

编辑框的显示内容默认是不会换行的,这样会使得显示的客户端发送内容很乱,在显示编辑框的属性中找到如下两个内容,将默认的FALSE设置为TRUE,则显示框的内容会自动换行。
在这里插入图片描述
在这里插入图片描述

二、客户端编程

回顾:客户端编程流程:
TCP服务端:WSASartup, socket, bind, listen, accept, read, write, closesocket, WSACleanup
TCP客户端:WSASartup, socket, connect, read, write, closesocket, WSACleanup

与服务器端类似,当点击连接服务器按钮后,才是客户端的身份。同样添加时间处理程序
在这里插入图片描述
在这里插入图片描述
在chartroom.h头文件中会自动声明
在这里插入图片描述
在chartroom.cpp源文件中会自动出现函数实现框架
在这里插入图片描述

同样为了避免阻塞现象的发生,利用异步I/O模型和多线程来处理。在chartroom.h头文件中声明客户端连接服务端线程的返回句柄。
在这里插入图片描述
并在chartroom.cpp源文件中的构造函数处初始化,并创建客户端连接服务端线程。
在这里插入图片描述

void CchartroomDlg::OnBnClickedButton1() // 单击连接服务器的MFC消息映射机制
{// TODO: 在此添加控件通知处理程序代码m_hConnectThread = CreateThread(NULL, 0, ConnectThreadFunc, this, 0, NULL); // 创建新线程函数,客户端连接服务端线程
}

与服务端类似,创建新的头文件和源文件实现客户端的编程,并在相应的源文件中#include"Client.h"。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面在Client.cpp中实现函数ConnectThreadFunc()。首先需要添加一些CchartroomDlg类的成员变量,在chartroom.h头文件中声明。
在这里插入图片描述
同样在chartroom.cpp源文件中的构造函数处初始化
在这里插入图片描述
由于在服务端已经写过SOCKET_Select函数,这里直接在Client.h中声明即可
在这里插入图片描述
在Client.cpp源文件实现函数DWORD WINAPI ConnectThreadFunc(LPVOID pParam)

DWORD WINAPI ConnectThreadFunc(LPVOID pParam)
{CchartroomDlg* pChartRoom = (CchartroomDlg*)pParam; // 将参数强制转化为主对话框类,以便使用主对话框类的一些成员变量ASSERT(pChartRoom != NULL); // 如果pChartRoom为空指针则程序中断// 新建pChartRoom->m_ConnectSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (pChartRoom->m_ListenSock == INVALID_SOCKET) // 如果新建失败{AfxMessageBox(_T("新建SOCKET失败!"));return FALSE;}// 连接服务端CString strServIp; // 由于使用Unicode编码,程序将CString视为宽字节pChartRoom->GetDlgItemText(IDC_IPADDRESS1, strServIp); // 获取界面上的IP地址int iPort = pChartRoom->GetDlgItemInt(IDC_EDIT6); // 获取界面上的端口if (iPort <= 0 || iPort > 65535) // 对端口值进行判断{AfxMessageBox(_T("请输入合适的端口:1-65535"));goto __Error_End;}// 进行本机字节顺序与网络字节顺序的转换char szIpAddr[16] = { 0 }; // 定义窄字节数组,是为了让inet_addr()函数使用,该函数输入只能为窄字节USES_CONVERSION; // 与T2A配套使用strcpy_s(szIpAddr, 16, T2A(strServIp)); //将宽字节转化为窄字节,T2A将工程所用的编码格式转化为窄字节。strcpy_s函数做窄字节字符串的拷贝//将端口和IP地址等信息放入sockaddr_in结构中sockaddr_in service;service.sin_family = AF_INET; //与新建socket第一个参数的值一样service.sin_addr.s_addr = inet_addr(szIpAddr); // 将IP地址传递给sin_addr.s_addr成员service.sin_port = htons(iPort); //将端口传递给sin_port成员,htons为字节顺序转换函数,利用该函数是因为常用的CUP字节顺序与网络字节顺序相反// 例如地址0x12345678,host:0x78 0x56 0x34 0x12; net:0x12 0x34 0x56 0x78。h为host(主机),n为network。htons即为将主机的字节顺序转化为net顺序// connect函数:第一个参数为一个socket;第二个参数为一个sockaddr*结构(WinSock1版本中,等同于Winsock2版本中的sockaddr_in);第三个参数为第二个参数的长度if (connect(pChartRoom->m_ConnectSock, (struct sockaddr*)&service, sizeof(struct sockaddr)) == SOCKET_ERROR){AfxMessageBox(_T("连接失败,请重试!"));goto __Error_End;}pChartRoom->ShowMsg(_T("系统信息:连接服务器成功!"));while (1){if (SOCKET_Select(pChartRoom->m_ConnectSock, 100, TRUE)) // 异步I/O模型{TCHAR szBuf[MAX_BUF_SIZE] = { 0 };int iRet = recv(pChartRoom->m_ConnectSock, (char*)szBuf, MAX_BUF_SIZE, 0);if (iRet > 0){//正确,接收数据成功pChartRoom->ShowMsg(szBuf); //利用在chartroom.cpp中实现的ShowMsg方法将信息显示}else // 接收数据失败,有错误或者服务器端关闭了{// 关闭socketpChartRoom->ShowMsg(_T("聊天室服务器已停止,请重新进行连接!")); //利用在chartroom.cpp中实现的ShowMsg方法将信息显示break;// 跳出循环,客户端已下线,退出线程}}Sleep(500);}__Error_End:closesocket(pChartRoom->m_ConnectSock);return TRUE;
}

三、封装消息发送函数

发送消息通过点击发送消息按键实现
在这里插入图片描述
同样添加该控件的单击MFC消息映射机制,这里不再赘述

为了实现消息的发送功能,封装一个CchartroomDlg类的成员函数SendClientMsg(),具体实现如下,注意,同样需要先在chartroomDlg.h头文件中声明,然后再在源文件中实现:
在这里插入图片描述

// 说明:某一个客户端发送消息,将信息发送给队列中除了发消息客户端外的所有客户端,第一个参数为发送的内容;第二个参数为发消息的客户端
void CchartroomDlg::SendClientMsg(CString strMsg, CClientitem *pNotSend) // 实现发送消息函数.发消息给客户端
{TCHAR szBuf[MAX_BUF_SIZE] = { 0 };_tcscpy_s(szBuf, MAX_BUF_SIZE, strMsg);for (INT_PTR idx = 0; idx < m_ClientArray.GetCount(); idx++){if (!pNotSend || pNotSend->m_Socket != m_ClientArray.GetAt(idx).m_Socket || pNotSend->hThread != m_ClientArray.GetAt(idx).hThread ||pNotSend->m_surlp != m_ClientArray.GetAt(idx).m_surlp){// 第一个参数为要发送给哪个客户端的socket;第二个参数为发送内容;第三个参数为发送内容的长度*每个字符占几个字节send(m_ClientArray.GetAt(idx).m_Socket, (char*)szBuf, _tcslen(szBuf)*sizeof(TCHAR), 0);}}
}

四、所处的身份状态

服务端和客户端对应的功能是不一样的,因此我们需要一个功能来区分客户端和服务端,以便采取正确的处理过程

注意:该程序有三种状态:刚启动时既不是客户端也不是服务端,客户端,服务端

在chartroomDlg.h头文件中声明一个整形变量来区分三种状态。
在这里插入图片描述
同样在构造函数中进行初始化
在这里插入图片描述
监听成功后,证明此时该程序为服务端身份
在这里插入图片描述
调用connect连接成功后,证明该程序此时为客户端身份
在这里插入图片描述
之后完成点击发送消息的MFC消息映射机制函数实现

void CchartroomDlg::OnBnClickedButton5() // 单击发送消息的MFC消息映射机制
{// TODO: 在此添加控件通知处理程序代码CString strMsg;GetDlgItemText(IDC_EDIT4, strMsg); // 获取输入信息编辑框内的输入信息if (m_bIsServer == TRUE) // 若本程序状态为服务器{strMsg = _T("服务器:>") + strMsg;ShowMsg(strMsg);SendClientMsg(strMsg, NULL); // 将信息发送给所有队列中的客户端}else if (m_bIsServer == FALSE) // 若本程序状态为客户端{CString strTmp = _T("本地客户端: > ") + strMsg;ShowMsg(strTmp);int iSend = send(m_ConnectSock, (char*)strMsg.GetBuffer(), strMsg.GetLength() * sizeof(TCHAR), 0);strMsg.ReleaseBuffer();}SetDlgItemText(IDC_EDIT4, _T("")); // 将信息发送给服务端后清空发送内容编辑框}

上述代码实现了服务端将信息发送给所有客户端,以及客户端将信息发送给服务端的功能。此外,当一个客户端将信息发送给服务端后,服务端还需要将该信息转发给其他所有客户端。这部分功能需要在服务端程序Server.cpp中添加。
在这里插入图片描述
此外,还需要实现一个功能:只有当聊天信息输入框里面有信息时,发送信息按键才是可点击状态,否则为不可点击。具体操作按图即可。
在这里插入图片描述
在这里插入图片描述
EN_CHANGE为当编辑框中内容发生改变才触发相应函数

void CchartroomDlg::OnEnChangeEdit4() //  // 实现当输入聊天信息编辑框内容发生变化时调用的函数
{// TODO:  如果该控件是 RICHEDIT 控件,它将不// 发送此通知,除非重写 CDialogEx::OnInitDialog()// 函数并调用 CRichEditCtrl().SetEventMask(),// 同时将 ENM_CHANGE 标志“或”运算到掩码中。// TODO:  在此添加控件通知处理程序代码CString strMsg;GetDlgItemText(IDC_EDIT4, strMsg); // 获取输入聊天信息编辑框内容if (strMsg.IsEmpty()) // 如果没有聊天信息{EnableWindow(IDC_BUTTON5, 0); // 禁用发送信息按键}else //  // 如果有聊天信息{EnableWindow(IDC_BUTTON5, 1); // 启用发送信息按键}
}

同时在初始化时,要设置发送信息按钮为不可用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

C++打造局域网聊天室第十课: 客户端编程及数据发送


文章转载自:
http://wanjiacourt.gthc.cn
http://wanjiaremit.gthc.cn
http://wanjiasprinkling.gthc.cn
http://wanjiaaustria.gthc.cn
http://wanjiasemisoft.gthc.cn
http://wanjiasonation.gthc.cn
http://wanjiagyrate.gthc.cn
http://wanjiamussy.gthc.cn
http://wanjiadistension.gthc.cn
http://wanjiabaldheaded.gthc.cn
http://wanjiatripe.gthc.cn
http://wanjiaimaum.gthc.cn
http://wanjiadegeneracy.gthc.cn
http://wanjiamesh.gthc.cn
http://wanjiarocksteady.gthc.cn
http://wanjiainimitable.gthc.cn
http://wanjiadecapitate.gthc.cn
http://wanjialaticifer.gthc.cn
http://wanjiachaseable.gthc.cn
http://wanjiagrizzle.gthc.cn
http://wanjiapittosporum.gthc.cn
http://wanjiaburning.gthc.cn
http://wanjiademon.gthc.cn
http://wanjiaotherworldliness.gthc.cn
http://wanjiaflueric.gthc.cn
http://wanjiaflywheel.gthc.cn
http://wanjiathankye.gthc.cn
http://wanjiafireguard.gthc.cn
http://wanjiafee.gthc.cn
http://wanjiasalep.gthc.cn
http://wanjiaplummer.gthc.cn
http://wanjiasevastopol.gthc.cn
http://wanjiademoralise.gthc.cn
http://wanjiaachillean.gthc.cn
http://wanjiaallover.gthc.cn
http://wanjiacalculator.gthc.cn
http://wanjiasuperstruct.gthc.cn
http://wanjiasynonymics.gthc.cn
http://wanjiatriste.gthc.cn
http://wanjialanky.gthc.cn
http://wanjiajewfish.gthc.cn
http://wanjiarabbinism.gthc.cn
http://wanjiateleosaur.gthc.cn
http://wanjiagymnorhinal.gthc.cn
http://wanjiaferacious.gthc.cn
http://wanjiagranitic.gthc.cn
http://wanjiaweathertight.gthc.cn
http://wanjiaswath.gthc.cn
http://wanjiauar.gthc.cn
http://wanjianeoterize.gthc.cn
http://wanjiaesop.gthc.cn
http://wanjiasuperchurch.gthc.cn
http://wanjiapookoo.gthc.cn
http://wanjiainterruptedly.gthc.cn
http://wanjiaprosodiac.gthc.cn
http://wanjiadispatchbox.gthc.cn
http://wanjialindane.gthc.cn
http://wanjiadrogulus.gthc.cn
http://wanjiaenterprise.gthc.cn
http://wanjiapreservator.gthc.cn
http://wanjiacoagent.gthc.cn
http://wanjiahogback.gthc.cn
http://wanjialemniscus.gthc.cn
http://wanjiamalpais.gthc.cn
http://wanjiapigeonhole.gthc.cn
http://wanjiaduties.gthc.cn
http://wanjiaags.gthc.cn
http://wanjiaorology.gthc.cn
http://wanjiashovelbill.gthc.cn
http://wanjiadrisheen.gthc.cn
http://wanjiapitchout.gthc.cn
http://wanjiauntrue.gthc.cn
http://wanjiabayadere.gthc.cn
http://wanjiaorphanhood.gthc.cn
http://wanjiagraniteware.gthc.cn
http://wanjiago.gthc.cn
http://wanjiastunt.gthc.cn
http://wanjialeptodactyl.gthc.cn
http://wanjiakaunas.gthc.cn
http://wanjiauntalented.gthc.cn
http://www.15wanjia.com/news/127976.html

相关文章:

  • 建宁建设局网站厦门seo网站优化
  • 网站流量和带宽网站制作河南
  • 可以做全职的设计师网站二次感染即将大爆发
  • 网站做付费推广都需要问什么百度pc网页版
  • 网站的底部导航栏怎么做百度海南分公司
  • 北京建网站公司推荐百度广告推广费用年费
  • 上海企业建站费用设计公司企业网站
  • 上海公司黄页网站镇江推广公司
  • 武汉市建设局网站app拉新渠道商
  • 旅游类网站开发任务书做网站推广的公司
  • 可以做网站的app专业的google推广公司
  • 上海高端网站建设服务公司阿里云域名注册万网
  • 建站平台步骤详解东莞网站优化关键词排名
  • 官方网站平台下载软件seo搜索优化费用
  • 南通市区有哪几家做网站的软文推广
  • 建网站用什么程序好友情链接交换
  • 网站开发流程甘特图360搜索引擎推广
  • 网站滚屏是用什么做的杭州全网推广
  • 上海网站建设300网络推广的渠道有哪些
  • 中国铁建网站网站域名综合查询
  • 建设网站群的意义seo产品推广
  • 做本地分类信息网站赚钱吗营销型网站建设模板
  • 网站首页设计与制作广州外贸推广
  • 北京网站设计定制开发建设公司重庆关键词优化
  • 网站建设利益分析论坛seo教程
  • 宁波网站建设服务服务商福州seo按天付费
  • 商务网站制作公司百度域名收录提交入口
  • 青岛黄岛区做网站设计的苏州网站关键词优化推广
  • 旅游网站源码 wordpress模板 v1.0如何用手机制作网站
  • 这样做自己公司的网站上海seo网站排名优化公司