一、设计目标

  之前已经写过了TCP服务器原理通过visual studio 验证 SOCKET编程:搭建一个TCP服务器,这里我们搭建一个TCP客户端界面并对各功能进行实现。设计效果如下:

二、实验步骤

2.1客户端建立

1、工程建立

  新建一个工程,环境有问题的请参考visual2017专业版MFC编程环境搭建及第一个MFC程序的创建

2、控件的添加

  在资源文件——TCPclient.rc

中打开Dialog,双击IDD_TCPCLIENT_DIALOG可以看到对话框

删除掉对话框上原有的控件,添加两个静态文本(STATIC),四个编辑框(EDIT)、两个命令按钮(BUTTON),布局如下:

3、修改控件属性

  鼠标选中控件,在属性对话框中设置其属性,如下表所示

修改完成后界面如图所示:

4、为控件添加相应函数和代码

 首先,在TCPclientDlg.cpp下的BOOL CTCPclientApp::InitInstance()中添加如下代码:

BOOL CTCPclientDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
... // TODO: 在此添加额外的初始化代码
GetDlgItem(IDC_SENDTEXT)->EnableWindow(false);
GetDlgItem(IDC_SEND)->EnableWindow(false);
GetDlgItem(IDC_TEXT)->EnableWindow(false); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

  屏蔽发送消息的功能,避免错误的发生。

然后,对套接字进行初始化,在TCPclientDlg.h中的class CTCPclientDlg : public CDialogEx的public添加定义

        SOCKET s;
sockaddr_in addr;

  在TCPclientDlg.cpp下的BOOL CTCPclientApp::InitInstance()中添加

s = ::socket(AF_INET, SOCK_STREAM, 0);

  完成套接字初始化

  

功能实现,为连接按钮添加消息响应函数

并编写事件处理函数如下所示

void CTCPclientDlg::OnConnect()
{
// TODO: 在此添加控件通知处理程序代码
CString str, str1;
int port;
GetDlgItem(IDC_ADDR)->GetWindowText(str);
GetDlgItem(IDC_PORT)->GetWindowText(str1);
if (str == "" || str1 == "")
{
MessageBox("服务器地址或端口不能为NULL");
}
else
{
port = atoi(str1.GetBuffer(1));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr(str.GetBuffer(1));
addr.sin_port = ntohs(port);
GetDlgItem(IDC_TEXT)->SetWindowText("正在连接服务器......\r\n");
if (::connect(s, (sockaddr*)&addr, sizeof(addr)))
{
GetDlgItem(IDC_TEXT)->GetWindowText(str);
str += "连接服务器成功!\r\n";
GetDlgItem(IDC_TEXT)->SetWindowText(str);
GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
GetDlgItem(IDC_SEND)->EnableWindow(true);
GetDlgItem(IDC_ADDR)->EnableWindow(false);
GetDlgItem(IDC_PORT)->EnableWindow(false);
}
else
{
GetDlgItem(IDC_TEXT)->GetWindowText(str);
str += "连接服务器失败!请重试\r\n";
GetDlgItem(IDC_TEXT)->SetWindowText(str);
}
}
}

  

当客户端与服务器连接成功之后,用户即可发送消息到服务器了,为发送按钮添加消息访问函数。

void CTCPclientDlg::OnSend()
{
// TODO: 在此添加控件通知处理程序代码
// TODO: Add your control notification handler code here
CString str, str1;
GetDlgItem(IDC_SENDTEXT)->GetWindowText(str);
if (str == "")
{
GetDlgItem(IDC_TEXT)->GetWindowText(str1);
//str1+="\r\n";
str1 += "消息不能为空\r\n";
GetDlgItem(IDC_TEXT)->SetWindowText(str1);
}
else
{
::send(s, str.GetBuffer(1), sizeof(str), 0);
GetDlgItem(IDC_TEXT)->GetWindowText(str1);
str1 += "\r\n";
str1 += str;
GetDlgItem(IDC_TEXT)->SetWindowText(str1);
}
}

  代码中,通过调用send将消息发送到指定服务器,并将改消息显示在本地显示框中,运行结果如图所示:

作为客户端,还应具有接受并显示服务器所发送消息的功能,,这里采用异步套接字模式实现该功能。在初始化函数中调用WSAAsyncSelect()函数如下:

	::WSAAsyncSelect(s, this->m_hWnd, WM_SOCKET, FD_READ);

  其中WM_SOCKET定义为

 #define WM_SOCKET WM_USER+100

  并在class CTCPclientDlg : public CDialogEx的Protect中添加

	afx_msg LRESULT OnSocket(WPARAM wParam, LPARAM lParam);

  添加消息响应函数成功后,还需要在消息映射表中将消息与响应相关联。在TCPclientDlg.cpp的BEGIN_MESSAGE_MAP中添加代码如下

	ON_MESSAGE(WM_SOCKET, &CTCPclientDlg::OnSocket)

  

最后编写自定义消息响应函数OnSocket(),实现套接字事件处理:

LRESULT CTCPclientDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
char cs[100] = { 0 };
if (lParam == FD_READ)
{
CString num = "";
recv(s, cs, 100, 0);
GetDlgItem(IDC_TEXT)->GetWindowText(num);
num += "\r\n服务器说:";
num += (LPTSTR)cs;
GetDlgItem(IDC_TEXT)->SetWindowText(num);
}
return 0;
}

  由于本实例,仅处理套接字的读取事件,所以使用if (lParam == FD_READ)。如果需要处理的套接字事件比较多,,那么应该在代码上进行分类判断。

至此,基本上完成了客户端应有的功能。在客户端程序中,需要注意连接服务器之前,一定要知道服务器的IP地址等信息,否则,程序将无法正确连接到服务器。

参考资料

MFC开发中添加自定义消息和消息响应函数

TCP的客户端搭建的更多相关文章

  1. Oracle服务端及客户端搭建帮助文档

    Oracle服务端及客户端搭建帮助文档 目录 简介 Oracle服务端安装 Oracle客户端安装 PLSQL安装 登录测试 系统配置修改 用户操作 解锁账户.密码 创建账户及密码 配置监听文件 监听 ...

  2. Java基础知识强化之网络编程笔记10:TCP之客户端读取文本文件服务器控制台输出

    1. TCP之客户端读取文本文件服务器控制台输出 (1)客户端:(发送数据到服务端) package cn.itcast_10; import java.io.BufferedReader; impo ...

  3. Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中

    1. TCP之客户端键盘录入服务器写到文本文件中 (1)客户端: package cn.itcast_09; import java.io.BufferedReader; import java.io ...

  4. oauth2.0服务端与客户端搭建

    oauth2.0服务端与客户端搭建 - 推酷 今天搭建了oauth2.0服务端与客户端.把搭建的过程记录一下.具体实现的功能是:client.ruanwenwu.cn的用户能够通过 server.ru ...

  5. CAS 5.1.x 的搭建和使用(三)—— 通过官方示例来熟悉客户端搭建

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...

  6. tcp程序设计--客户端获取服务器输入输出流

    tcp程序设计--客户端获取服务器输入输出流 思路: 第一步:实例化一个ServerSocket对象(服务器套接字),用来等待网络上的请求(也就是等待来连接的套接字) 第二步:调用accept()方法 ...

  7. yum仓库客户端搭建和NTP时间同步客户端配置

    一.yum仓库客户端搭建 yum源仓库搭建分为服务器端和客户端. 服务端主要提供软件(rpm包)和yumlist.也就是提供yum源的位置.一般是通过http或者ftp提供位置. 客户端的配置:yum ...

  8. 时间服务器: NTP 服务器及客户端搭建

    时间服务器: NTP 服务器及客户端搭建 一. NTP 服务器的安装与设定 1. NTP 服务器的安装与设定前言 2. 所需软件与软件结构 3. 主要配置文件 ntp.conf 的处理 4. NTP ...

  9. 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

    UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...

随机推荐

  1. 【笔记】Python基础三:文件

    一,文件操作 (一),文件处理流程 1,打开文件,获得文件句柄(open函数提供)并赋值 2,通过句柄对文件进行操作 3,关闭句柄 f = open('陈粒',encoding='utf-8')#op ...

  2. mysql 开启root外部链接权限

    mysql给root开启远程访问权限,修改root密码 1.MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问. 这对于 Web-Server ...

  3. 完成一个Laravel项目的过程

    1.分析项目,找出项目的元素并进行建模(navicat 该工具还可以到处sql语句) 建立关系 2.安装Laravel(使用composer来安装,如果没有的话先安装composer) 3.配置虚拟主 ...

  4. 20175126《Java程序设计》第八周学习总结

    # 20175126 2016-2017-2 <Java程序设计>第八周学习总结 ## 教材学习内容总结 - 本周学习方式主要为手动敲代码并理解内容学习. - 学习内容为教材第十五章,本章 ...

  5. CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-2设置SSH免密登录

    因为hadoop集群在安装的时候需要集群中所有机器的权限. 所以我们需要打通所有节点的ssh无密码登陆,思路是生成每台机子的密钥,集中在一个文件中,再分发到每台机子上. 为了确保下面的命令能顺利执行, ...

  6. CentOS7 查看显卡信息

    A卡: [root@t1 ~]# lspci | grep -i vga 00:02.0 VGA compatible controller: Cirrus Logic GD 5446 N卡: [ro ...

  7. Mysql数据库性能优化(一)

    参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要 ...

  8. 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)

    本文转自https://my.oschina.net/u/1866821/blog/297673 索引的重要性数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义. ...

  9. Numpy安装

    Python官网上的发行版是不包含Numpy模块的. 1.使用已有的发起行版本 对于许多用户,尤其是在Windows上,最简单的方法就是下载以下的Python发行版,他们包涵了所有的关键包(包括Num ...

  10. mycat读写分离性能测试

    1.    MySQL主从配置 我们的方案设计基于Mysql的主从数据复制功能,以下是基于mysql5.5以上版本最新的主从配置. 开启mysql主从数据复制,主要在mysql的my.ini文件中设置 ...