自制即时通信系统:socket网络编程(4)

By | 09月30日
Advertisement

之前大概介绍了IM服务端的构架和部分代码,其中对于具体信息包的用例函数没有列出来,有兴趣和时间的可以直接玩玩。
现在来介绍客户端的构架,因为这是给用户用的,当然要有界面,这里选择了MFC对话框应用程序,具体构架如下:
首先,从socket类的继承关系开始:
这一部分我是参考资料书的,windows sockets类的继承关系如下:

CSocket类:MFC已有的类,作为基类;
CCommunicatingSocket类:主要封装了底层通信函数,如:rio_writeline()、rio_readinitb、rio_readlineb()这些都是直接引用的《深入理解计算机系统》的11,12章部分介绍的rio健壮包函数;
CTCPSocket类:是对客户端套接字的封装,封装的函数有SetupTCPClientSocket(const char *host, const char *service)等;
CTCPServerSocket类:是对服务器端套接字的封装,如前所述,客户端也有一个服务器套接字用来不断接受服务器即时发来的信息,且这个socket的端口为客户端socket的port+1000(这是笔者为了方便才这样做的)。
此外:为了方便起见还可以定义一个CError类,用来处理与socket相关的错误;
关于类的构架就说到这里,当然,还有一些对话框类就不一一表述了。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

接下来介绍的是客户端的线程模式,由于是MFC对话框程序,主线程自然不用说,此外,其余的线程的生成方式如下如:

自制即时通信系统:socket网络编程(4)

在线上报线程:每sleep一段时间就像服务器发送一个信息包,告诉它咱还是正常在线用户。
聊天信息接收线程:循环接受UDP包,一旦收到消息,就给主线程发送消息,通知有好友找你啦,弹个对话框呗。
即时接收服务器信息线程:接受服务器不定时的突发信息,比如某某好友突然上线或是下线,或者添加询问通知等。

以上是客户端的主体构架,至于具体的编程,在接下来的文章中我会以功能用例的形式一一介绍;

Similar Posts:

  • linux下C语言socket网络编程简例

    转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移

  • linux c++ socket 网络编程(1)同步阻塞、非阻塞模型

    1.网络编程基本模型介绍 linux的网络编程有很多种写法,最简单的是阻塞式(Blocking)的网络程序,其次有非阻塞(Non-Blocking),多路复用(Multiplexing),异步(Asynchronous)模型等. 1.1. 阻塞模型 阻塞模型是最为简单的一种网络编程模型.顾名思义,该模型中,socket都工作在阻塞模式下,在调用相应的网络函数时,如accept, recv, send时,这些函数都会阻塞线程,直到socket可读或者可写,或者出错时,线程才会继续执行. 举一个例子

  • java网络编程之socket网络编程示例(服务器端/客户端)

    Java为TCP协议提供了两个类,分别在客户端编程和服务器端编程中使用它们.在应用程序开始通信之前,需要先创建一个连接,由客户端程序发起:而服务器端的程序需要一直监听着主机的特定端口号,等待客户端的连接.在客户端中我们只需要使用Socket实例,而服务端要同时处理ServerSocket实例和Socket实例;二者并且都使用OutputStream和InpuStream来发送和接收数据. 学习一种知识最好的方式就是使用它,通过前面的笔记,我们已经知道如何获取主机的地址信息,现在我们通过一个简单的

  • socket网络编程--初等网络函数介绍

    socket网络编程--初等网络函数介绍 Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用, 会返回一个 通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的好处.我们可以通过向描述符读写操作实现网络之间的数据交流. (一)socket int socket(int domain, int type,int protocol) domain:说明我们网络程序所在的主机采用的通讯协族(AF_U

  • 【java编程】tcp/udp——Socket网络编程部分

    TCP--Socket网络编程部分: 特点:1.tcp是面向连接的,连接时需要三次握手 2.tcp适合传输大数据 3.tcp能保证数据的完整性,传输速度稍慢 构成:1.分为客户端和服务器端 2.客户端建立Socket服务,服务端直接使用客户端建立的Socket服务来完成数据的传输 接下来我们就来用一张图来说明,客户端和服务端的关系吧! 客户端配置的一般思路: 1.建立客户端Socket服务,并指定服务器的主机ip地址和端口号 2.如果是上传文件,要先建立相应的读取流 3.得到Socket服务的O

  • MFC socket网络编程(流程示例)

    MFC socket网络编程(流程示例) 1.TCP流式套接字的编程步骤 在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK! 服务器端程序: 1.加载套接字库 2.创建套接字(socket). 3.将套接字绑定到一个本地地址和端口上(bind). 4.将套接字设为监听模式,准备接收客户请求(listen). 5.等待客户请求到来:当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept). 6.用返回的套接字和客户端进行通信(send

  • Socket网络编程学习笔记(5):发送和接收实体类数据

    Socket网络编程学习笔记(5):发送和接收实体类数据 在前面讲述的篇幅中,发送的都是文本信息,我们只要通过Encoding中的几个方法把文本转化成二进制数组就可以利用Socket来传输了,这对于一些基本的信息传输能够得到满足,但对于一些复杂的消息交流,则有些"吃力".我们有时候会把一些信息封闭在一个类中,如果Socket能够传送类对象,那么一些复杂的问题能够通过面向对象来解决了,即方便又安全.大家都知道,要想在网络上传输信息,必须要经过序列化才行,所以在传送类对象时,首选必须对该类

  • linux下C语言socket网络编程

    这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移植时服务端可以不用更改,编译后可直接运行:客户端将ip改为服务器的地址,然后编译运行.可以使用netstat 进行查

  • Socket网络编程学习笔记(1)

    虽然天天上博客园欣赏各位“大侠”的杰作,偶然回首,突然发现自己已成“潜水者”久矣.本来对于自己有限的水平,有点不好意思在此发贴,不过潜伏久了,才慢慢意识到老是通过浏览他人的文章虽然能够提高自己能力,能够及时的获取新技术新思想,但却只能停留在他人的思想上.通过学习,加上自己的想法,再写出来,让大家来指证错误,不仅能够巩固自己的知识,也可以让一些跟我一样迷惘的朋友们不用再去走一些弯路,岂不是两全其美,本着这样的想法,打算把自己平时的所学所想都写下来,欢迎各路朋友批评指证,因为你的批评和建议能够让我更

  • Socket网络编程系列教程序

    C语言的用途相当多,可以用在数据结构.数据库.网络.嵌入式等方面,历经40多年不衰,真是厉害!最近一直想从某一应用方面写一个系列教程,好好地把某一方面讲深讲透.         正好博主对网络方面的编程技术感兴趣,因此先写一个C语言在网络编程相关的技术.系列教程的文章名都以"(C语言实现)Socket网络编程系列教程"开头.博主才疏学浅,系列教程有不对的地方,恳请读者留言指出.        博主是上班族,只能抽空写写,更新频率不一定很快,不过一定会尽快地更新!

  • android之socket网络编程

    最近在学习android关于网络编程的知识,在这个过程中也遇到了不少问题,这篇文章是android基于socket的网络编程,能让人更好的了解网络编程底层的相关知识.其他话就不说了,直接看代码吧. 服务器端采用的是图形化界面: package com.app.qrs; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.

Tags: