基于socket的聊天程序设计内容摘要:
Header 函数开设录音缓冲区。 9 waveInAddBuffer 函数实现录音。 (音频的捕捉和播放相反) 远程控制模块分析 图 332 远控模块方案 远控端的分析: 远程监控的程序设计通过 Socket 和应用消息机制来监控客户端与被监控端得数据交换,从而达到监控与被监控的目的。 这样我们就需要 2 个独立的 程序:客户端 Client 和服务端 Server。 服务端的模块设计: 网络模块 负责监听客 户端的 connect,接收客户端发来的消息,包括键盘、鼠标等动作,本 PC对这些消息进行处理,做出动作后发送到客户端。 编码、解码:如果要对得到的图像进行处理,则需要对数据进行编码解码处理,本程序采用霍夫曼压缩。 主框架:负责对 Server 端得消息窗口处理和映射。 客户端的设计: 网络部分:负责监听服务端的 Socket,对向服务端发来的数据进行处理 ,对发来的数据进行解压。 编码、解码:对数据进行解压,多数采用霍夫曼来对数据进行解压。 主框架:负责客户端窗口的消息机制处理。 10 第四章 关键技术与算法 服务 端主体类 主体服务端的函数 CServerDlg:创建服务器主窗口,管理用户信息,用户在线状态等 CListenSocket:用于监听客户端端口 CChatPacket:数据包类 CCuserInfo:用户信息类 CServerApp:应用程序实例类 CArchive 和 CSocketFile 为 MFC 类,与 CClientSocket 类一起实现数据的发送与接受。 这些 类 都是为启动 服务端 服务而创建的,其中启动服务 中的InitInstance()函数定义了启动方式,用 Creat 方式创建了套接字和绑定了套接字,最后在 Listen 函数中监听。 如果在异步中创建套接字,则使用 CAsyncSocket类。 当一切准备工作建立完成后,数据就应该被传送和接收,其中用到了OnReceive, OnSend,OnAccept,OnConnect,OnClose。 这样就完成了服务端的建立,并启动了监听。 具体算法 在创建一个 socket 时,可以把他设置为阻塞,也可以设置为异步。 在缺省情况下,都创建为阻塞模式。 要使程序变成非阻塞,则可以使用 WSAAsynSelect函数,这个函数的原型为: int WSAAsyncSelect(SOCKET s,HWND hWnd,u_int wMsg,long IEvent)。 其中参数 1 指定了要操作的 socket 句柄;参数 2 使用了窗口句柄,则最重要的是指定一个网络事件。 IEvent 下的主要参数类型 FD_READ 期望在套接字上收到数据(即读准备好)时接到通知 FD_WRITE 期望在套接字上可发送数据(即写准备好)时接到通知 FD_OOB 期望在套接字上有带外数据到达时接到通知 FD_ACCEPT 期望在套接字上有外来连接时接到通知 FD_CONNECT 期望在套接字连接建立完成时接到通知 FD_CLOSE 期望在套接字关闭时接到通知 rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE)。 一般这样建立,就可以完成异步模式了。 如果想注销次次对话,则把事件置 0就行了。 服务端创建完套接字后,剩下的就是绑定,监听,连接,关闭连接,关闭套接字。 如果采用了 CREATE 算法建立套接字,则采用另一种异步方式,也是建立套接字的主流方式,因为这种方式是面向流的套接字,使传输更加圆滑。 Create的函数原型为: Create( UINT nSocketPort=0, Int nSocketType=SOCK_STREAM, Long Ievent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE, LPCTSTR lpszSocketAddress = NULL)。 这时 Ievent 已经有了整个通信的过程: FD_ACCEPT 通知侦听套接字当前有连接请求可以接受 OnAccept(int 11 nErrorCode)。 FD_CONNECT 通知请求连接的套接字,连 接要求已被处理 OnConnect(int nErrorCode)。 FD_CLOSE 通知套接字与其连接的套接字已关闭 OnClose(int nErrorCode)。 FD_READ 通知有数据到达 OnReceive(int nErrorCode)。 FD_WRITE 通知可以发送数据 OnSend(int nErrorCode)。 FD_OOB 通知将有外带数据 到达 OnOutOfBandData(int ErrorCode)。 在 MFC 里建立套接字,其中有个著名的异步套接字类: CAsyncSocket 与 Winsock 不同, CAsyncSocket 服务端不用绑定 (Bind),不用连接 (Connect)。 正常情况下,服务器端必须首先创建一个 CAsyncSocket 套接字对象,并调用它的 Create 成员函数创建底层套接字句柄。 这个套接字对象专门用来侦听来自客户机的连接请求,所以称它为侦听套接字对象。 再调用侦听套接字对象的。 Listen 函数,使侦听套接字对象开始侦听来自客户端的连接请求。 (1) 当 Listen 函数确认并接纳了一个客户端连接请求后,触发 FD_ACCEPT 事件,侦听套接字收到通知, MFC 框架自动调用侦听套接字的 OnAccept 事件处理函数。 一般需要重载 OnAccept 函数,再在其中调用侦听套接字对象的 Accept 函数。 (2) 创建一个新的空套接字对象,专门用来与客户端连接并进行数据的传输,一般称为连接套接字,并作为参数传递给下一步的 Accept 成员函数。 (m_sConnectSocket)。 在 本次 扩展端 C/S 模式中 均采用这种方式来建立算法。 图 41 服务端算法 12 客户端类 主体客户端类 CClientDlg:创建客户端主窗口,接收和发送消息 CLientLoginDlg:登陆服务器窗口类 CChatPacket:数据包类 CClientApp:应用程序实例 关于客户端 ,也需要 Init 来实现客户端的建立,只不过,这里使用了异步的方式,用到了 TCP 面向连接的监听方式,使用 Connect 进行连接。 在接收和发送数据上附加了更多的处理, 为了让消息显示出来,使用了共有成员函数ProcessPendingRead(),设置缓冲区,并定义为 200,然后对格式进行 format,最后在列表框中显示出来,发送消息时用 OnSend()就可以了,这个之需要一个响应。 这样客户端就建立起来了,至于扩展方式,下面会有详细分析。 具体算法: 创建客户端套接字算法和服务端大体相似,不同之处在于 Create 的函数,这里所指定的地址为服务端的地址: BOOL Create( UINT nSocketPort = 端口号, Int nSocketPort = SOCK_STREAM | SOCK_DGRAM, LPCTSTR lpszSocketAddress = 套接字所用的网络地址 ); 客户端请求连接到服务器端,在服务器端套接字对象已经进入侦听状态之后,客户应用程序可以调用 CAsyncSocket 类的 Connect 成员函数,向服务器发出一个连接请求。 调用结束返回时发生 FD_CONNECT 事件, MFC 框架会自动调用客户端套接字的 OnConnect 事件处理函数。 CSocket 类是 CAsyncSocket 的派生类。 创建 CSocket 对象时,首先要调用 CSocket 类的构造函数创建一个空的 CSocket 对象,再调用其 Create 成员函数,创建对象的底层套接字。 这里必须对 CSocket 的算法进行了解: CSocket 类使用基类 CAsyncSocket 的同名成员函数 Connect、 Listen、 Accept 来建立服务器和客户机套接字之间的连接,使用方法基本相同。 在创建 CSocket 类对象后,对于流式套接字,首先在服务器和客户机之间建立连 接,然后使用 Send 函数、 Receive 函数来发送和接收数据。 需要注意的是, CSocket 对象从不调用 OnConnect 和 OnSend 事件处理函数。 CSocket 类继承了 CAsyncSocket 类的许多成员函数,用法基本一致。 CSocket类的高级性主要表现在 3个方面。 (1) CSocket 结合 CArchive 类来使用套接字。 (2) CSocket 管理了通信的许多方面,比如字节顺序问题和字符串转换问题。 (3) CSocket 类为 Windows 消息的后台处理提供了阻塞的工作模式。 有关阻塞的概念读者可参阅相关文献资料,此处不再赘述。 因此,一般将 CSocket 与 CArchive、 CSocketFile 类相结合,来发送和接收数据,这将使编程更为简单。 13 图 42 客户端算法 14 第五章 程序的实现及测试 客户端 实现 图 511 聊天窗口登录窗口 对话框类 Login 基于 CDialog 封装中有 3 个 触 发 函 数 :OnBnClickedOk()。 OnBnClickedButton1()。 OnEnChangeEdit1()。 OnBnClickedOk() 触发了登陆按钮控 件,这个事件是为了检查服务器 IP 是否设置正确,用户账户是否为空,空则返回 MessageBox 错误提示。 OnBnClickedButton1() 触发了帮助按钮,此处使用 CreateProcess()函数 调用了成都理工大学主页,当然也可以改成你所需要的帮助页面。 OnEnChangeEdit1() 触发了输入编辑框,输入 IP和用户账户。 如果成功登陆则显示 : 图 512 聊天系统客户端主窗口 15 图 513 双方进行通信的客户端 1窗口 OnInitDialog()函数进行初始化 :主要对套接字进 行绑定,监听,接收和 发送数据的处理。 1) 指定端口,绑定: 指定需要绑定的地址类型: SOCKADDR_IN sin; 字符型服务器地址 ulAddress=i_addr(); m_name=; 绑定套接字 sockServer=socket(PF_INET,SOCK_STREAM,0); 地址家族 =AF_INET; 把 IP地址保存为一个 4字节的数值 =ulAddress; 指定端口 =htons(9000); 2) 进行连接服务器 Int nConnect=connect(sockServer,(LPSOCKADDR)amp。 sin,sizeof(struct sockaddr)); 3) 采用第一种方式建立套接字WSAAsyncSelect(sockServer,m_hWnd,WM_SOCKET_READ,FD_READ); 4) 发送用户信息nCharSend=send(sockServer,(char*)amp。 myinfo,sizeof。基于socket的聊天程序设计
相关推荐
燃气动力推动活塞运动。 活塞的往复运动经过连杆推动曲轴作 旋转运动, 曲轴再从飞轮端将动力输出。 由活塞组、连杆组、曲轴和飞轮组成的曲柄连杆机构是内燃机传递动力的主要部分。 汽缸的建模步骤主要分为:绘制汽缸草图 →拉伸草图至 70mm→与汽缸底面相距 130mm绘制草图,拉伸草图至 150mm→拉伸切除孔Ф 50,形成与曲轴轴颈相配合的凹槽→完成汽缸建模。 5 曲轴建模
True, 12, 12, , , True, , , False) (D1@草图 3).SystemValue = α True boolstatus = (Line4, SKETCHSEGMENT, , , , False, 0, Nothing, 0) boolstatus = (Line6, SKETCHSEGMENT, , , , True, 0, Nothing, 0) Set
10mm,但不应小于 8mm,也不应小于 12mm。 砂浆的作用:一是铺平砖的砌筑表面,二是将块体砖粘接成一个整体。 规范中之所以有厚度和宽度要求,是由于灰缝过薄,使砌体产生不均匀受力,影响砌体随载能力。 如果灰缝过厚,由于砂浆抗压强度低于压的抗压可度。 在荷载作用下,会增大砂浆的横向变形,降低砌体的强度。 试验研究表明,当水平灰缝为 12mm 时,砖砌体的抗压强度极限,仅为 10mm 厚时的
分别设计客户端与服务器端的界面,并使用 Java 应用程序用户界面的开发工具包 Swing 进行窗体界面的布局,以及实现部分窗口事件的相应。 (图 1 系统框架图) 6 (图 2 系统通信原理图) 3) 数据库设计,本系统使用的数据库为 MySQL;因为本系统只简单的记住用的信息,所以系统只设计了一张 t_users(用户表)表 : 字段名 类型 是否为空 备注 Username
学图像处理的研究重点。 近年来,随着一些新兴技术 (如模糊数学、数学形态学、数字拓扑学、人工智能等 )在图像处理中的应用,使图像分割技术取得了显著的进展,一些全新的图像自动分割技术应运而生 ,如模糊分割技术、基于知识的分割技术、人工神经网络分割技术等。 这些技术代表了近年来医学图像分割的最新研究成果,也是今后若干年医学图像分割技术的研究方向。 ③ 基于特定理论的新的分割算法
号的离散状态。 基本的三种数字调制方式是:振幅键控 (ASK)、移频键控 (FSK)和移相键控 (PSK 或 DPSK)。 本章重点论述二进制数字调制系统的原理及其抗噪声性能,简要介绍多进制 数字调制原理。 二进制振幅键控 (2ASK) 振幅键控是正弦载波的幅度随数字基带信号而变化的数字调制 .当数字基带信号为二进制通信系统仿真 10 时 ,则为二进制振幅键控 . 设发送的二进制符号序列由 0