c++MFC CSocket仿QQ聊天软件,实现1对1聊天,群聊
c仿qq课程设计
c 仿qq课程设计一、课程目标知识目标:1. 学生能理解并掌握C语言中结构体和函数的基本概念及其在编程中的应用。
2. 学生能够运用C语言实现基本的聊天功能,如发送消息、接收消息等。
3. 学生了解并掌握简单的文件读写操作,实现对聊天记录的保存和加载。
技能目标:1. 学生通过本课程的学习,培养编程思维和问题解决能力,能够运用C语言设计并实现类似QQ的简易聊天程序。
2. 学生能够运用所学知识,进行程序调试和优化,提高程序性能和稳定性。
3. 学生能够通过团队协作,共同完成课程项目,提高沟通与协作能力。
情感态度价值观目标:1. 学生在学习过程中,培养对编程的兴趣和热情,提高信息素养。
2. 学生通过课程实践,认识到编程对于解决实际问题的价值,增强自信心。
3. 学生在团队合作中,学会尊重他人意见,培养集体荣誉感和责任感。
课程性质:本课程为C语言编程实践课,旨在通过实现类似QQ的聊天功能,让学生将所学理论知识运用到实际项目中。
学生特点:学生为初中生,具备一定的C语言基础,对编程感兴趣,喜欢动手实践。
教学要求:结合学生特点,课程设计应注重实践性和趣味性,引导学生主动探索,提高编程能力和团队协作能力。
通过分解课程目标,使学生在完成具体学习成果的过程中,达到课程目标。
后续教学设计和评估将以此为基础,确保课程目标的实现。
二、教学内容1. 结构体和函数复习:回顾C语言中结构体的定义和使用,以及函数的声明、定义和调用,为后续实现聊天功能打下基础。
(对应教材章节:结构体与函数)2. 聊天功能实现:- 消息发送与接收:介绍标准输入输出函数,实现用户之间的消息发送与接收。
- 用户登录与注册:结合结构体,设计用户信息数据结构,实现用户登录与注册功能。
(对应教材章节:文件操作、控制语句)3. 聊天记录保存与加载:- 文件读写:介绍文件操作函数,实现对聊天记录的保存和加载功能。
- 数据存储格式:讲解如何选择合适的数据存储格式,提高数据的可读性和可维护性。
仿QQ聊天软件--基于局域网TCP蓝精灵聊天软件的实现
西南大学计算机与信息科学学院学年设计报告课程:学年设计题目:蓝精灵聊天软件级、专业:2014级计算机科学与技术专业2班学生姓名:杨XX提交日期:2016年12月16日目录1 概述 (1)2 基本概念和方法、工具 (1)(1)基本概念 (1)(2)方法 (2)(3)开发工具 (3)3 设计方案 (3)(1)总体设计 (3)(2)界面设计 (4)(3)服务器端设计说明 (5)(4)服务器端设计 (5)(5)客户端设计 (6)(6)数据库设计 (9)4 源代码 (10)(1)服务器端 (10)(2)客户端 (22)(3)数据库 (34)5 简要的使用说明 (35)6 总结 (40)7 参考文献 (41)蓝精灵聊天软件系统1概述即时通信软件为我们提供了诸多的方便,使我们逐步享受信息时代的便捷。
我们最熟悉的即时通信软件就是QQ了,因为它几乎已经融入了我们每个人的日常生活。
由此可见,生活在信息时代的人们对即时通信、聊天软件有巨大的需求,这样的软件也将为我们节省大量的时间。
然而,基于internet的QQ已经深入人心,要想再去做可能没有任何竞争力。
此时,我们可以换一个角度,调整用户对象。
如今的时代背景下,信息的泄露早已屡见不鲜,尤其是一些大企业的内部信息,如果这些信息泄露,可能会造成巨大的经济损失,甚至将导致企业破产。
因此,为了便捷内部人员之间的交流,做这样的一个内部即时通信、聊天软件还是很有市场的。
我们的目标就是做的仿QQ的聊天软件蓝精灵,面向内部人员使用的即时通信软件。
为了方便内部人员之间便捷的交流,需要开发一款适合内部人员进行即时通信的软件,这样的软件既满足了内部人员之间便捷的交流,同时,也防止内部信息的外流,开发这样一款即时通信软件,是很有必要的。
综合以上因素,我们利用C#网络通信编程实现了基于TCP/IP可靠网络通信系统—蓝精灵聊天软件。
本软件包括两个部分,客户端和服务器。
服务器的功能主要是监听客户端发来的连接请求并予以响应、转发客户端的信息、响应客户端执行注册、登录等的操作以及关闭连接。
MFC实现简单网络聊天程序
MFC实现简单网络聊天程序MFC(Microsoft Foundation Classes)是微软公司提供的一个应用程序框架,用于开发Windows系统上的图形用户界面程序。
在此基础上,我们可以利用MFC来实现简单的网络聊天程序。
首先,我们需要创建一个MFC应用程序项目。
使用Visual Studio打开,选择MFC应用程序向导,选择对话框风格。
然后,设置对话框的布局,包括聊天消息显示框、消息输入框、发送按钮等控件。
接下来,我们需要使用Socket编程来实现网络通信功能。
MFC提供了CSocket类,我们可以使用它来处理数据的发送和接收。
在对话框类中添加成员变量m_socket,类型为CSocket。
在OnInitDialog函数中,我们需要创建Socket,并进行连接。
可以通过使用Create函数创建CSocket对象,并调用Connect函数来连接指定的地址和端口号。
例如,可以连接到本地主机上的一些端口,这样就可以进行本地测试。
然后,我们需要添加事件处理函数来处理发送和接收消息。
当发送按钮被点击时,可以通过调用Socket对象的Send函数将消息发送给服务器。
可以使用CString类来处理字符串数据。
当接收到消息时,可以通过调用Socket对象的Receive函数将消息接收到的缓冲区中。
为了提供实时地聊天消息显示功能,我们需要使用SetWindowText函数将数据显示到聊天消息显示框中。
当接收到消息时,可以将消息显示在聊天消息显示框中,同时可以使用UpdateData函数实时更新界面。
在程序结束时,我们需要断开连接并销毁Socket对象。
在析构函数中,可以调用Shutdown函数来关闭连接,然后销毁Socket对象。
除了基本的发送和接收消息功能,我们还可以添加一些其他的功能,比如可以使用菜单栏来选择连接和断开服务器,可以添加登录和注册功能等。
这些可以根据实际需求进行扩展。
总结起来,通过使用MFC应用程序框架和Socket编程,我们可以实现简单的网络聊天程序。
C语言编写网络聊天工具
C语言编写网络聊天工具C语言作为一种高效、灵活的编程语言,在网络聊天工具的开发中扮演着重要的角色。
本文将介绍如何使用C语言编写一个简单的网络聊天工具,并着重讨论实时通信、消息传递和用户界面设计等方面的问题。
1. 引言在当今社交化的时代,网络聊天工具的需求日益增长。
通过网络聊天工具,人们可以方便地与他人进行沟通和交流,促进社会、工作和学习等各个方面的发展。
而C语言作为一种经典的编程语言,其能够提供高效的性能和灵活的功能,非常适合用于网络聊天工具的开发。
2. 网络编程基础在开始编写网络聊天工具之前,我们首先需要了解一些网络编程的基础知识。
C语言提供了一系列的库函数来实现网络编程功能,例如socket、bind、listen等等。
通过这些函数,我们可以建立服务器和客户端之间的通信连接,实现消息的传递和数据的交换。
3. 实时通信实时通信是网络聊天工具的核心功能之一。
在C语言中,我们可以使用套接字(socket)来实现实时通信。
服务器和客户端之间可以通过套接字进行连接,通过send和recv函数进行消息的发送和接收。
在实现实时通信时,我们需要考虑消息的封装和解析、连接的建立和维护、错误处理等方面的问题。
4. 用户界面设计用户界面设计是网络聊天工具的另一个重要方面。
通过一个友好、直观的用户界面,用户可以方便地进行操作和进行聊天。
在C语言中,我们可以使用图形库(如GTK+或Qt)或者命令行界面来实现用户界面。
不同的界面设计方案有不同的特点和适用场景,开发者可以根据实际需求选择合适的方案。
5. 消息传递在网络聊天工具中,消息的传递是至关重要的。
C语言提供了丰富的数据结构和函数来进行消息的封装和解析。
我们可以定义一个消息结构体,包含发送者、接收者、时间戳、内容等属性,通过函数进行消息的打包和解包。
同时,我们还可以使用消息队列、线程或者信号量等技术来实现多线程处理,提高并发性能。
6. 安全性和保密性在网络聊天工具的开发中,安全性和保密性是非常重要的考虑因素。
利用MFC的Csocket类实现网络通信
服务器端的创建(6)
编辑界面,对界面上的控件点击右键,选择属性选项,可 以修改ID(把ID改为有意义的名字)和标题
界面上没有控件的地方点击右键,弹出菜单,单击“建立 类向导”(或者英文版叫Class Wizard),为每个控件添加 变量。注意控件ID、变量类型、变量名(参看下页“建立类 向导”)
s_ip=CString(“127.0.0.1”); //默认的目的ip地址
UpdateData(FALSE);
//变量的值传到界面上
c_BTNSend.EnableWindow(FALSE);//发送按钮失效
19
客户端的创建(6) “连接”按钮代码
void CLXClientDlg::OnBtnConnect()//连接按钮相关代码 {
修改控件ID,通过“新建类向导”为控件添加变量
16
客户端的创建(3)程序关闭时关闭端口
通过“建立类向导”,添加WM_DESTROY消息响应函数 1单击
2单击确定
17
客户端创建(4)关闭端口代码
添加关闭端口代码
18
客户端创建(5)
初始化时添加代码,即在 BOOL CLXClientDlg::OnInitDialog()的末尾添加下面代码
2
服务器端的创建(1)
新建工程LXServer
3
服务器端的创建(2)
创建的程序类型为“基本对话”
4
服务器端的创建(3)
选择Windows Sockts支持
5
服务器端的创建(4)
接下来几步直接点击“下一步”,直到下面对话框单击 “完成”
6
服务器端的创建(5)
界面制作7ຫໍສະໝຸດ 添加控件(以客户端界面为例)
仿QQ即时通讯应用软件开发毕业设计
仿QQ即时通讯应用软件开发摘要:本文按照软件工程的思想和开发步骤,采用C/S模式,利用SQL Server数据库,使用Visual C++开发工具设计并实现了一个仿QQ的即时通讯应用软件。
该软件实现了消息的即时传输、文本传输、语音聊天等功能,具体包括网络通信、协议包封装与解析、文件传输以及基于directsound框架的音频处理。
系统为保证语音传输的质量和效率,采用一定的声音编码格式对声音数据打包并传输到接收方。
该系统功能全面,界面美观,操作方便,具有一定的实用价值。
关键词:socket, 文字聊天,文件传输,实时语音传输,directsoundAbstract: In this paper, according to the software engineering and development steps, using C / S mode, the SQL Server database and Visual C++ language the system was designed and implement.The software has implemented the real-time transmission, transmission of text messages, voice chat and other functions, such as network communications, protocol packet encapsulation and analysis, file transfer and frame-based audio processing directsound.To ensure the quality and efficiency of the voice transmission the system adopt a certain voice encoding format for audio coding packaged and transmitted to the receiver side. The system is fully functional, beautiful interface, easy to operate, and has a certain practical value.Keywords: socket, text chat,file transfer, real-time voice transmission, directsound一、概述互联网的迅速发展不仅改变了人们的意识形态,更影响着人们的生活方式,网络元素在不知不觉中渗透到生活的每一个角落。
用C语言写聊天工具,类似于QQ
C 语言究竟能干什么序言鉴于现在已经大三了,很多同学很迷茫,自己学的东西到底能做什么,将来自己到底能干什么?我不想看着同学迷茫的面孔,特别是几个好兄弟,有几个想学习编程,但又苦苦找不到门路的兄弟,所以想写点东西,希望对大家又点略微的帮助,以尽兄弟我的微薄之力。
很多同学学了C语言之后,可能难免会有所感叹:这就是C语言!总是感觉C语言竟然能写出Windows、Linux?为了解除同学们的疑惑,也愿为同学们指点编程之道吧。
我写的这些东西采用C语言,计划通过编程实例来讲解C编程的一些知识,让大家对C能又更深一层的理解和认识。
当然,大家不要指望看了这些之后会写出一个操作系统来,但是我想,如果你认真看了的话,写一个类似与QQ的聊天程序应该不难。
本来书是假期里照顾妈妈时写的,原想是1、不让自己的水平停滞不前,温故知新(两个月的假期是很长的)2. 帮助一些同学,解决编程上的困惑3.希望妈妈快点康复4.让母亲和家里人知道自己一直都很努力,我是好样的但现在母亲已经能够不在了,所以第三点,就改为原母亲在天之灵得到慰藉,早日放下烦恼,不用惦记我们。
C语言的基本语法我是不打算再提了,很多C语言编程的书,就是将一些基本的数据类型、数据结构、语法,然后就是一些数值计算的实例,大多数都是雷同的,难免有抄袭之嫌,而且页没有多少实用价值。
本书以实用实例作为编程指导,指引大家编写真正实用的程序。
了解到大家对黑客程序、病毒、窗口类程序比较感兴趣,因此我就拿这些实例进行讲解。
基于大家基本都用Windows XP SP3,我也就在这个系统上把程序调试成功后再给大家讲解。
编程环境,我还是喜欢Visual C++ 6.0本书计划从四个大的方面来讲,这四个方面是:窗口类、文件操作类、网络类、数据库类。
都是时下流行的编程必备技术,也是软件开发者,必须掌握的技术。
中间以实例讲解,逐步学习,相信大家看完后会有很大的提高的。
第一章窗口类程序的编写这一章就先来讲解下窗口类程序的编写。
用MFC CSocket类实现的网络聊天室
12、为对话框CTsDlg的“监听”和“停止服务”两个按钮添加消息响应函数。(方法可以在对话框资源编辑窗口双击对应按钮,或使用类向导)
voidCTsDlg::OnBnClickedButtonListen()
{
// TODO: Add your control notification handler code here
}
}
5、从CSocket类派生两个套接字类,一个名为CLSocket,专用于监听客户机端的连接请求;另一个名为CCSocket,用于与客户机建立连接并交换数据。操作步骤为:选择菜单“项目”->“添加类”,在弹出的对话框中选择“MFC类”项,单击“添加”按钮;然后在弹出的“MFC添加类向导”窗口中输入类名,并选择基类为CSocket,如图所示。
if(msg.m_bClose)
{
pSocket->Close();
POSITION pos,temp;
CCSocket *pTemp;
for(pos=m_connList.GetHeadPosition();pos!=NULL;)
{
temp=pos;
pTemp=(CCSocket*)m_connList.GetNext(pos);
Sort
False
6
IDC_STATIC_NUM
Caption
聊天室在线人数:0
3、打开“MFC类向导”,按照下表设置控件在CTsDlg类中的成员变量,效果如图所示;
控件ID
成员变量名称
类别
变量类型
IDC_STATIC_NUM
m_strNum
Value
CString
IDC_EDIT_PORT
c++MFC CSocket仿QQ聊天软件,实现1对1聊天,群聊
c++/MFC CSocket仿QQ聊天软件,实现1对1聊天,群聊分类:c++ 2012-11-25 16:45 1582人阅读评论(13) 收藏举报c++C++mfcMFCqqQQsocket聊天学习,c++有2个星期了。
本来,本人是做php出身的。
做php快2年了,最近身边多了很多高手。
让自己对c开始感兴趣了,就开始学习c++了。
首先接触的就是mfc。
前几天,看到了一个博文,是有关,mfc网络编程的。
可对方,的实例只能是多对多,出于兴趣,自己改写了下它的程序,实现了点对点的聊天。
所以,本实例并非纯原创的。
这个还请大家见谅,尤其是作者。
我在他程序基础上,增加了1对1的聊天,同时还保留了群聊。
而且,最关键的是,我增加了很多备注。
很适合新手学习。
本人也是新手,还请各位高手提出宝贵建议。
先谢谢大家了。
如果要转载请注明原地址:/open520yin/article/details/8222279实例下载地址:/detail/open520yin/4808903(为了自己能有点下载积分,客户端和服务端一起打包5个积分不算贵吧。
呵呵。
)大家要是想看懂这个可能还需要先了解一下mfc的socket的一些基本使用规则我也有一篇博文写了c++/MFC 极为简单的socket实例:/open520yin/article/details/8202465MFC的CSocket编程,利用CSocket实现一个基于TCP实现一个QQ聊天程序。
///////////////////////////////////////////////////////////////////////// 服务端start ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////先讲讲服务端,一切先从服务端开始:首先就是要使用AfxSocketInit初始化winsocket,[cpp]view plaincopyprint?1. //初始化winSock库,成功则返回非0否则返回02. WSAData wsData;3. if(!AfxSocketInit(&wsData))4. {5. AfxMessageBox(_T("Socket 库初始化出错!"));6. return false;7. }m_iSocket 是一个CServerSocket*的指针 ,CServerSocket类是一个我们自己的类我会在后面给出相应代码,他继承于CSocket类。
模拟qq聊天小程序课程设计
模拟qq聊天小程序课程设计一、课程目标知识目标:1. 学生能够理解并掌握QQ聊天小程序的基本原理和功能。
2. 学生能够了解并运用程序设计中的顺序、选择和循环结构。
3. 学生能够掌握在QQ聊天小程序中实现文字、表情发送和接收的基本方法。
技能目标:1. 学生能够运用所学知识,设计并编写一个简单的模拟QQ聊天小程序。
2. 学生能够在编写程序过程中,熟练使用编程软件,掌握调试和修改程序的基本技巧。
3. 学生能够通过小组合作,提高沟通与协作能力,共同完成课程任务。
情感态度价值观目标:1. 学生培养对编程的兴趣和热情,树立编程改变生活的信念。
2. 学生在学习过程中,培养解决问题的能力和勇于尝试的精神。
3. 学生通过课程学习,认识到网络交流的重要性,提高网络素养,尊重网络道德规范。
本课程针对初中年级学生,结合教材内容,注重实用性,旨在让学生在掌握编程知识的同时,提高实际操作能力和团队协作能力。
课程目标具体、可衡量,便于学生和教师在教学过程中明确预期成果,为后续的教学设计和评估提供依据。
二、教学内容本章节教学内容主要包括以下三个方面:1. 程序设计基础知识:- 了解编程语言的基本概念,如变量、数据类型、运算符等。
- 学习程序设计的基本结构,包括顺序、选择和循环结构。
2. QQ聊天小程序功能实现:- 分析QQ聊天小程序的功能需求,明确文字、表情发送和接收的实现方法。
- 学习使用编程语言实现聊天界面设计、消息发送与接收等核心功能。
3. 实践与拓展:- 制定实践任务,分组进行模拟QQ聊天小程序的开发,培养学生的实际操作能力。
- 结合教材相关章节,拓展学习网络编程知识,了解实际应用场景。
教学内容安排和进度如下:1. 程序设计基础知识(2课时)2. QQ聊天小程序功能实现(3课时)3. 实践与拓展(2课时)本教学内容紧密结合课程目标,注重科学性和系统性,按照教学大纲逐步推进,确保学生能够学以致用,提高编程实践能力。
教学内容与教材章节紧密关联,为学生提供清晰的学习路径和丰富的学习资源。
c#实现网络聊天室(socket)仿QQ课程设计报告书
Visual C#程序设计课程设计(报告)题目: 网络聊天室专业班级:地信131 学生:胡宏勇学号: 1220130912 完成时间:_________ 2015.7.12______________________任务书项目四网络聊天室4.1、目的与要求1. 目的:1)要求学生达到熟练掌握.NET基本结构以及C#语言的基本知识和技能;2)基本掌握面向对象程序开发的基本思路和方法;3)掌握网络程序开发的基本知识;4)能够利用所学的基本知识和技能,进行简单的网络通信程序设计。
2. 要求基本要求:1)要求利用C#的编程思想以及套接字开发原理来完成系统的设计;2)突出C#语言与其它语言不同点(即体现C#的高级功能,如属性概念、接口、事件、委托等);3)体现可视化编程基本东西,如系统带有菜单、工具栏、状态栏以及一些常用的高级控件。
创新要求:在基本要求达到后,可进行创新设计,如加入文件传输功能,以及远程控制功能。
4.2、信息描述有关该系统基本信息的描述,如:客户端实例的信息等。
类似于QQ。
4.3、功能描述1. 聊天室服务器端的创建。
2. 聊天室客户端的创建。
3. 实现客户与服务器的连接通讯。
4. 实现客户之间的私聊。
5. 实现客户端的在线信息显示。
6. 实现服务器端当前在线客户信息。
7. 保存谈话记录。
4.4、解决方案1. 首先进行需求分析,搞清楚系统功能和任务。
2. 然后总体设计中确定模块结构,划分功能模块,将软件功能需求分配给所划分的最小单元模块。
确定模块间的联系,确定数据结构、文件结构、数据库模式,确定测试方法与策略。
3. 详细设计中为每个模块确定采用的算法,选择适当的工具表达算法的过程(流程图),描述模块的详细过程;确定每一模块使用的数据结构;确定模块接口的细节,包括对系统外部的接口和用户界面,对系统部其它模块的接口。
4. 依据分析编写C#代码。
目录1.需求分析 - - - - - - - - - - - - - - - - - - - - 1 1.1 摘要1.2 系统开发背景1.3聊天软件的开发目标2.概要设计 - - - - - - - - - - - - - - - - - - - - 22.1 服务器端2.2 客户端3.详细设计 - - - - - - - - - - - - - - - - - - - - 34.编码 - - - - - - - - - - - - - - - - - - - - 64.1 服务器端核心编码4.2 客户端核心代码5.调试分析 - - - - - - - - - - - - - - - - - - - 186.用户使用说明 - - - - - - - - - - - - - - - - - 277.课程设计总结 - - - - - - - - - - - - - - - - 288.参考文献 - - - - - - - - - - - - - - - - - - - 281.需求分析1.1摘要作为除电视、报纸、广播之外的第四大媒体,互联网不仅成为人们获取新闻信息的主要来源,更成为了人们闲暇之余的一种休闲手段。
Java中基于TCPsocket的一对一简单聊天室
江苏经贸职业技术学院信息技术学院2015-2016-2学年《网络编程技术(java)》课程期末大作业2016年4月一、程序功能简介本程序拥有图形界面与一对一聊天程序,实现监听连接、发送、退出功能。
先启动Server服务器端程序进行端口监听,然后启动Client客户端连接Server端IP地址与端口号,Server端监听到后显示连接成功,可以进行通信。
二、运行界面截图(一)界面主程序(二)客户端程序三、核心代码说明(一)Client、java核心代码说明示例package gwd;import java、awt、*;import java、awt、event、*;import java、io、*;import java、net、InetAddress;import java、net、InetSocketAddress;import java、net、Socket;import java、net、UnknownHostException;import javax、swing、*;import javax、swing、border、EmptyBorder;public class Client extends JFrame implements Runnable, ActionListener, KeyListener {private static final long serialVersionUID = 85429018L;private JScrollPane textPane;//滚动条private JLabel pcLabel,portLabel;//标签private JTextArea chatArea;//聊天内容区域private JTextField pctextField,porttextField,sendField;//文本框private JButton connectButton,sendButton;//按钮private Socket socket;//客户端套接字对象private DataInputStream in;//数据输入流对象private DataOutputStream out;//数据输出流对象private Thread thread;//线程private JComboBox namecomboBox;//下拉列表框public Client() {createUserInterface();//调用图形界面setTitle("客户端");//设置标题setSize(550,500);//设置宽度与高度setResizable( false );//禁用界面最大化setLocationRelativeTo(null);//自动释放大小setVisible(true);//窗口显示出来setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE);//点击关闭默认关闭窗口}public void createUserInterface() {setLayout(null);//设置布局JPanel contentPane=new JPanel();//创建顶部 panelcontentPane、setBounds(5, 5, 525 , 50);//设置panel坐标add(contentPane);//添加控件到窗口屏幕中pcLabel = new JLabel("主机:");//创建主机标签contentPane、add(pcLabel);pctextField = new JTextField();//创建主机文本框contentPane、add(pctextField);pctextField、setColumns(10);portLabel = new JLabel("端口");//创建端口标签contentPane、add(portLabel);porttextField = new JTextField();//创建端口文本框porttextField、setColumns(10);contentPane、add(porttextField);namecomboBox = new JComboBox();//创建下拉列表框namecomboBox、addItem( "张三" );//设置值namecomboBox、addItem( "李四" );//设置值namecomboBox、setSelectedIndex( 0 );namecomboBox、setEditable(true);//设置允许选择contentPane、add(namecomboBox);chatArea = new JTextArea();//创建聊天内容区域chatArea、setLineWrap(true); //设置换行textPane = new JScrollPane(chatArea);//滚动条textPane、setBounds(5, 60, 525, 360);add(textPane);sendButton = new JButton("发送");//创建发送按钮sendButton、setBounds(355, 430, 80, 24);sendButton、addKeyListener(this);//绑定发送按钮键盘对象sendButton、addActionListener(this);//绑定发送按钮点击对象add(sendButton);sendField = new JTextField(255);//创建发送文本框sendField、setBounds(5, 430, 330, 24);sendField、addKeyListener(this);//发送文本框绑定键盘事件add(sendField);connectButton = new JButton("连接");//创建连接按钮connectButton、setBounds(450, 430, 80, 24);connectButton、addActionListener(this);//绑定连接按钮对象contentPane、add(connectButton);socket = new Socket();//创建客户端Sokcet对象thread = new Thread(this);//创建线程对象}public void connect() { //创建客户端Socket套接字try {if (!socket、isConnected()) { //判断套接字就是否连接成功InetAddress address= InetAddress、getByName(pctextField、getText());//获取本地IP地址对象InetSocketAddress socketAddress = newInetSocketAddress(address, Integer、parseInt(porttextField、getText()));//创建InetSocketAddress对象socket、connect(socketAddress);//连接服务器in= new DataInputStream(socket、getInputStream());//创建数据输入流对象out = new DataOutputStream(socket、getOutputStream());//创建数据输出流对象sendButton、setEnabled(true);//启动发送按钮if (!(thread、isAlive())) { //判断线程就是否激活thread = new Thread(this);//创建线程对象}thread、start();//启动线程}} catch (Exception e) {System、out、println(e);socket = new Socket();//创建Socket对象}}public void send() { //向客户端发送消息String msg = sendField、getText()、trim();//获取发送消息内容if (msg、isEmpty()) { //判断就是否为空JOptionPane、showMessageDialog(this, "请输入发送消息、");//提示return;}chatArea、append(namecomboBox、getSelectedItem()+": " + msg + "\n");//追加文本到聊天内容区域中try {out、writeUTF(namecomboBox、getSelectedItem()+": "+msg);//发送消息到客户端sendField、setText("");//清空消息} catch (Exception e) {e、printStackTrace();}}public void actionPerformed(ActionEvent arg0) { //点击事件if (arg0、getSource() == sendButton) { //发送按钮send();//发送消息} else if (arg0、getSource() == connectButton) { //连接对象connect();//启动客户端套接字对象}}public void run() { //启动线程if (Thread、currentThread() == thread) { //判断就是否当前线程String msg = null;while (true) { //循环接收客户端消息try {msg = in、readUTF();//将数据读取出来chatArea、append("服务器: " + msg + "\n");//显示文本域中} catch (IOException e) {e、printStackTrace();socket = new Socket();break;}}}}public void keyPressed(KeyEvent arg0) { // 键盘按下if (arg0、getKeyCode() == KeyEvent、VK_ENTER) {send();//发送消息}}@Overridepublic void keyReleased(KeyEvent arg0) {@Overridepublic void keyTyped(KeyEvent arg0) {}public static void main(String[] args) {EventQueue、invokeLater(new Runnable() {public void run() {try {Client frame = new Client();frame、setVisible(true);} catch (Exception e) {e、printStackTrace();}}});}}二、Server、java核心代码说明示例package gwd;import java、awt、*;import javax、swing、*;import javax、swing、border、EmptyBorder;import java、awt、event、*;import java、io、BufferedReader;import java、io、InputStreamReader;import java、io、PrintWriter;import java、net、ServerSocket;import java、net、Socket;import java、awt、event、ActionEvent;import java、awt、event、ActionListener;import java、awt、event、KeyEvent;import java、awt、event、KeyListener;import java、io、DataInputStream;import java、io、DataOutputStream;import java、io、IOException;import javax、swing、JButton;import javax、swing、JFrame;import javax、swing、JOptionPane;import javax、swing、JPanel;import javax、swing、JScrollPane;import javax、swing、JTextArea;import javax、swing、JTextField;public class Server extends JFrame implements Runnable, ActionListener, KeyListener {private JScrollPane textPane;//滚动条private JLabel portLabel;//标签private JTextArea chatArea;//聊天内容区域private JTextField portField,sendField;//文本框private JButton sendButton,startButton;//按钮private ServerSocket serversocket;//服务器套接字对象private Socket socket;//客户端套接字对象private DataInputStream in;//数据输入流对象private DataOutputStream out;//数据输出流对象private Thread thread;//线程public Server() {createUserInterface();//调用图形界面setTitle("服务器");//设置标题setSize(550,500);//设置宽度与高度setResizable( false );//禁用界面最大化setLocationRelativeTo(null);//自动释放大小setVisible(true); //显示出来setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE);//点击关闭默认关闭窗口}public void createUserInterface() {setLayout(null);//设置布局JPanel contentPane=new JPanel();//创建顶部panelcontentPane、setBounds(5, 5, 525, 50);//设置panel坐标add(contentPane);portLabel = new JLabel("端口");//创建端口标签contentPane、add(portLabel);portField = new JTextField();//创建端口文本框contentPane、add(portField);portField、setColumns(10);chatArea = new JTextArea();//创建聊天内容区域chatArea、setLineWrap(true);//设置换行textPane = new JScrollPane(chatArea);//滚动条textPane、setBounds(5, 60, 525, 360);add(textPane);sendButton = new JButton("发送");//创建发送按钮sendButton、setBounds(355, 430, 80, 24);sendButton、addActionListener(this);//绑定发送按钮点击对象add(sendButton);sendField = new JTextField(255);//创建发送文本框sendField、setBounds(5, 430, 330, 24);sendField、addKeyListener(this);//消息框绑定键盘事件监听add(sendField);startButton = new JButton("启动");//创建启动按钮startButton、setBounds(450, 430, 80, 24);startButton、addActionListener(this);//绑定启动按钮对象contentPane、add(startButton);thread = new Thread();//创建线程对象}public void connect() { //创建服务器ServerSocket套接字try {chatArea、append("请稍等、、、\n");//添加文本到聊天内容区域中serversocket = new ServerSocket(Integer、parseInt(portField、getText()));//创建ServerSocket 套接字对象socket = serversocket、accept();//接收客户端套接字对象chatArea、append("连接成功、、、\n");//追加信息到聊天内容区域中,显示成功连接服务器in = new DataInputStream(socket、getInputStream());//创建数据输入流对象out = new DataOutputStream(socket、getOutputStream());//创建数据输出流对象if (!thread、isAlive()) { //判断线程就是否激活thread = new Thread(this);//创建线程对象}thread、start();//启动线程} catch (Exception e) {System、out、println(e);try {serversocket = new ServerSocket();//创建ServerSocket 套接字对象} catch (IOException e1) {e1、printStackTrace();}}}public void send() { //向客户端发送消息String msg = sendField、getText()、trim();//获取发送消息内容if (msg、isEmpty()) { //判断就是否为空JOptionPane、showMessageDialog(this, "请输入发送消息、");//提示消息return;}chatArea、append("服务器: " + msg + "\n");//追加文本到聊天内容区域中try {out、writeUTF(msg);//发送消息到客户端sendField、setText("");} catch (Exception e) {e、printStackTrace();}}public void actionPerformed(ActionEvent arg0) { //键盘事件if (arg0、getSource() == sendButton) { //发送按钮send();//发送消息} else if (arg0、getSource() == startButton) { //连接对象connect();//启动服务器套接字对象}}public void run() { //启动线程if (Thread、currentThread() == thread) { //判断就是否当前线程String msg = null;while (true) { //循环接收客户端消息try {msg = in、readUTF();//将数据读取出来chatArea、append(msg + "\n");//显示在聊天内容区域中} catch (IOException e) {e、printStackTrace();try {serversocket = new ServerSocket(4331);} catch (IOException e1) {e1、printStackTrace();}break;}}}}public void keyPressed(KeyEvent arg0) { // 键盘按下if (arg0、getKeyCode() == KeyEvent、VK_ENTER) {send();//发送消息}}@Overridepublic void keyReleased(KeyEvent arg0) {}@Overridepublic void keyTyped(KeyEvent arg0) {}public static void main(String[] args) {EventQueue、invokeLater(new Runnable() {public void run() {try {Server frame = new Server();frame、setVisible(true);} catch (Exception e) {e、printStackTrace();}}Java中基于TCPsocket的一对一简单聊天室});}}四、创新点说明本程序基于TCPsocket实现网络即时通信,客户端可用多种身份与服务器端聊天,方便、快捷、易懂。
java网络编程一:Socket用法,简单模拟一对一聊天
java⽹络编程⼀:Socket⽤法,简单模拟⼀对⼀聊天1、socket和serverSocket通信简单介绍如下,注意客户端与服务器端是怎么交换数据的2、模拟qq聊天功能,实现客户端与服务器(⼀对⼀)的聊天功能服务器端代码:[java]01. <span style="font-size:16px;">package ;02.03. import java.io.DataInputStream;04. import java.io.DataOutputStream;05. import java.io.IOException;06. import .ServerSocket;07. import .Socket;08. import java.util.Scanner;09.10. /**11. * 模拟qq聊天功能:实现客户端与服务器(⼀对⼀)的聊天功能,客户端⾸先发起聊天,输⼊的内容在服务器端和客户端显⽰,12. * 然后服务器端也可以输⼊信息,同样信息也在客户端和服务器端显⽰13. */14.15. // 服务器类16. public class ChatServer {17. private int port = 8189;// 默认服务器端⼝18.19. public ChatServer() {20. }21.22. // 创建指定端⼝的服务器23. public ChatServer(int port) {24. this.port = port;25. }26.27. // 提供服务28. public void service() {29. try {// 建⽴服务器连接30. ServerSocket server = new ServerSocket(port);31. // 等待客户连接32. Socket socket = server.accept();33. try {34. // 读取客户端传过来信息的DataInputStream35. DataInputStream in = new DataInputStream(socket36. .getInputStream());37. // 向客户端发送信息的DataOutputStream38. DataOutputStream out = new DataOutputStream(socket39. .getOutputStream());40. // 获取控制台输⼊的Scanner41. Scanner scanner = new Scanner(System.in);42. while (true) {43. // 读取来⾃客户端的信息44. String accpet = in.readUTF();45. System.out.println(accpet);46. String send = scanner.nextLine();47. System.out.println("服务器:" + send);48. // 把服务器端的输⼊发给客户端49. out.writeUTF("服务器:" + send);50. }51. } finally {// 建⽴连接失败的话不会执⾏socket.close();52. socket.close();53. }54. } catch (IOException e) {55. e.printStackTrace();56. }57. }58.59. public static void main(String[] args) {60. new ChatServer().service();61. }62. }63. </span>客户端代码:[java]01. <span style="font-size:16px;">package ;02.03. import java.io.DataInputStream;04. import java.io.DataOutputStream;05. import java.io.IOException;06. import .Socket;07. import java.util.Scanner;08.09. /**10. * 注意⽤到的输⼊输出流DataInputStream和DataOutputStream,成对出现,最好⽤字节流11. */12. // 客户端类13. public class ChatClient {14. private String host = "localhost";// 默认连接到本机15. private int port = 8189;// 默认连接到端⼝818916.17. public ChatClient() {18.19. }20.21. // 连接到指定的主机和端⼝22. public ChatClient(String host, int port) {23. this.host = host;24. this.port = port;25. }26.27. public void chat() {28. try {29. // 连接到服务器30. Socket socket = new Socket(host, port);31.32. try {33. // 读取服务器端传过来信息的DataInputStream34. DataInputStream in = new DataInputStream(socket35. .getInputStream());36. // 向服务器端发送信息的DataOutputStream37. DataOutputStream out = new DataOutputStream(socket38. .getOutputStream());39.40. // 装饰标准输⼊流,⽤于从控制台输⼊41. Scanner scanner = new Scanner(System.in);42.43. while (true) {44. String send = scanner.nextLine();45. System.out.println("客户端:" + send);46. // 把从控制台得到的信息传送给服务器47. out.writeUTF("客户端:" + send);48. // 读取来⾃服务器的信息49. String accpet = in.readUTF();50. System.out.println(accpet);51. }52.53. } finally {54. socket.close();55. }56. } catch (IOException e) {57. e.printStackTrace();58. }59. }60.61. public static void main(String[] args) {62. new ChatClient().chat();63. }64. }65. </span>运⾏结果:注意运⾏的时候要先开服务器,再开客户端,聊天由客户端发起。
(完整)基于MFC仿QQ聊天程序设计完整实例教程
本系统基于客户端/服务器基本原理,程序即是服务端,也是客户端,通过IP就可以相互添加好友,并且实现点到点通信,有聊天记录(未实现根据用户发送的消息而改变字体颜色,只能在客户端改),字体颜色设置(一改全改~),包含主界面MaindBord和聊天Talk两大功能模块。
(1) MaindBord模块A、登录模块登陆模块的实现过程有下面几个步骤:(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效(2)确认登陆后创建套接字,绑定,监听(3)初始化成功后,激活添加好友和隐藏功能B、好友模块添加好友的实现过程有下面几个步骤:(1)弹出对话框(2)获取对话框中的IP(3)检查对方是否在线,建立连接(4)发送请求验证C、好友列表模块(1)客户接收请求,将服务端加入列表,发送客户端信息(2)服务端得到客户端信息,加入列表(3)双击好友列表,弹出发送信息对话框D、隐藏模块(1)隐藏与显示(2)响应鼠标,弹出控制菜单(2)聊天Talk模块A、发送信息模块聊天模块中,发送信息模块的实现过程有下面几个步骤:(1)通过列表双击一个好友为聊天对象,弹出聊天窗口;(2)用户按下发送按钮后,检测对方是否在线,检测对方是否在线(3)将聊天内容发送出去(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。
B、接收信息模块聊天模块中,接收信息模块的实现过程有下面几个步骤:(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口(2)读取消息,并写入聊天记录,(3)载入字体颜色信息。
(4) 显示聊天记录C、聊天记录管理模块聊天记录管理模块的实现过程有下面几个步骤:(1)将发送内容和接收内容写入文本文件;(2)显示聊天记录;(3)删除聊天记录。
D、字体颜色模块实现字体颜色模块的过程有下面几个步骤:(1)调用系统字体,获取字体,写入存档(2) 调用系统字体颜色,获取颜色,写入存档(3)读取、更新字体颜色。
课程设计项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——完善客户端聊天信息主窗口程序类(第3部分)
J2EE课程设计实训教学示例项目《蓝梦教育集团即时通讯系统》(仿腾讯QQ)——完善客户端聊天信息主窗口程序类(第3部分)1.1.1完善客户端聊天信息主窗口类ChatMainFrame中的各个事件类1、ChatMainFrame_ActionListenerEventHandler(1)类名称为ChatMainFrame_ActionListenerEventHandler,包名称为com.px1987.imsystem.client.frame.chatframe.event,实现java.awt.event.ActionListener接口(2)编程该事件类package com.px1987.imsystem.client.frame.chatframe.event;import java.awt.Color;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import javax.swing.ImageIcon;import javax.swing.JColorChooser;import javax.swing.text.BadLocationException;import javax.swing.text.SimpleAttributeSet;import javax.swing.text.StyleConstants;import javax.swing.text.StyledDocument;import com.px1987.imsystem.client.dialog.FontChooserDialog;import com.px1987.imsystem.client.exception.IMSystemException;import com.px1987.imsystem.client.factory.GenericTypeMethodsFactory;import com.px1987.imsystem.client.frame.chatframe.panel.ChatMainFrame_CenterInfoPanel; import com.px1987.imsystem.client.frame.floatwindow.SelectUserFaceWindow;importcom.px1987.imsystem.client.httpclient.inter.HttpClientMessageInfoRequestResponseInterface; import com.px1987.imsystem.client.util.DateAndTimeUtil;import com.px1987.imsystem.client.util.IMSystemClientUtils;import com.px1987.imsystem.client.xmlparse.ParseXMLConfFileAllTags;import com.px1987.imsystem.serializableVO.MessageInfoVO;public class ChatMainFrame_ActionListenerEventHandler implements ActionListener { private ChatMainFrame_CenterInfoPanel eventSourceContainer = null;private String eventHandlerMethodName = null;public ChatMainFrame_ActionListenerEventHandler() {super();}public ChatMainFrame_ActionListenerEventHandler(ChatMainFrame_CenterInfoPanel eventSourceContainer,String eventHandlerMethodName) {super();this.eventSourceContainer = eventSourceContainer;this.eventHandlerMethodName = eventHandlerMethodName;}@SuppressWarnings("unchecked")public void actionPerformed(ActionEvent actionEventObject) {Class currentEventHandlerClass = this.getClass();Method eventHandlerMmethod = null;try { //获得事件处理方法eventHandlerMmethod = currentEventHandlerClass.getMethod(this.eventHandlerMethodName, new Class[] {actionEventObject.getClass()});} catch (SecurityException exception) {exception.printStackTrace();System.out.println("出现了SecurityException异常错误,错误信息为:" +exception.getMessage());} catch (NoSuchMethodException exception) {exception.printStackTrace();System.out.println("出现了NoSuchMethodException异常错误,错误信息为:" + exception.getMessage());}try { //调用指定的事件处理方法eventHandlerMmethod.invoke(this, new Object[] {actionEventObject});} catch (InvocationTargetException exception) {exception.printStackTrace();System.out.println("出现了InvocationTargetException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalArgumentException exception) {exception.printStackTrace();System.out.println("出现了IllegalArgumentException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalAccessException exception) {exception.printStackTrace();System.out.println("出现了IllegalAccessException异常错误,错误信息为:" + exception.getMessage());}}public void closeThisFrameButton_onClick(ActionEvent e) {eventSourceContainer.getOneChatMainFrame().dispose();eventSourceContainer.getOneChatMainFrame().setVisible(false);}public void sendMessageButton_onClick(ActionEvent e) {String messageContent=eventSourceContainer.getSendInfoTextPane().getText();if((messageContent.equals("")||(messageContent.length()==0))){return; //如果本次没有真正输入聊天信息的内容,则不进行发送}// MessageInfoVO returnMessageInfoVO=null;String sendMessageTime=DateAndTimeUtil.getHourMinuteSecondString();StringmessageSender=IMSystemClientUtils.getUserLoginOnLineInfoVOInstance().getUserAliaoName ()+"("+IMSystemClientUtils.getUserLoginOnLineInfoVOInstance().getUserIMCode()+")";StringmessageReceiver=eventSourceContainer.getOneFindFriendInfoVO().getUserAliaoName()+"("+ eventSourceContainer.getOneFindFriendInfoVO().getUserIMCode()+")";MessageInfoVO oneMessageInfoVO=new MessageInfoVO();oneMessageInfoVO.setSendMessageTime(sendMessageTime);oneMessageInfoVO.setMessageContent(messageContent);oneMessageInfoVO.setMessageSender(messageSender);oneMessageInfoVO.setMessageReceiver(messageReceiver);StringhttpClientMessageInfoRequestResponseeClassName=ParseXMLConfFileAllTags.getProperty("h ttpClientMessageInfoRequestResponse.className");HttpClientMessageInfoRequestResponseInterface oneHttpClientMessageInfoRequest=null;try {oneHttpClientMessageInfoRequest =new GenericTypeMethodsFactory().newSomeOneInstance(httpClientMessageInfoRequestResponsee ClassName); //利用范型工厂方法直接获得目标对象实例}catch (IMSystemException exception) {exception.printStackTrace();System.out.println("出现了OASystemException异常错误,错误信息为:"+exception.getMessage());}try {// returnMessageInfoVO = oneHttpClientMessageInfoRequest.doSendMessageInfo(oneMessageInfoVO);oneHttpClientMessageInfoRequest.doSendMessageInfo(oneMessageInfoVO);} catch (IMSystemException exception) {exception.printStackTrace();System.out.println("出现了OASystemException异常错误,错误信息为:" +exception.getMessage());}eventSourceContainer.getSendInfoTextPane().setText("");String oneMessageText=sendMessageTime+" "+messageSender+"对"+messageReceiver+"说:"+ "\n ";//下面的代码设置标题为粗体样式SimpleAttributeSet oneSimpleAttributeSet = new SimpleAttributeSet();StyleConstants.setBold(oneSimpleAttributeSet, true);StyledDocumentchatResultTextPaneDocument=eventSourceContainer.getChatResultTextPane().getStyledDocume nt();try {chatResultTextPaneDocument.insertString(chatResultTextPaneDocument.getLength(),oneMessageText,oneSimpleAttributeSet);} catch (BadLocationException exception) {exception.printStackTrace();System.out.println("出现了BadLocationException异常错误,错误信息为:" + exception.getMessage());}chatResultTextPaneDocument=eventSourceContainer.getChatResultTextPane().getStyledDoc ument();try {chatResultTextPaneDocument.insertString(chatResultTextPaneDocument.getLength(),messageContent+"\n",eventSourceContainer.getSendInfoTextPane().getParagraphAttributes());} catch (BadLocationException ex) {}}public void chooseFaceButton_onClick(ActionEvent e) {int floatPanelWidth = 436;int floatPanelHeight = 320;SelectUserFaceWindow oneSelectUserFaceWindow =new SelectUserFaceWindow(eventSourceContainer.getOneChatMainFrame(),floatPanelWidth, floatPanelHeight);oneSelectUserFaceWindow.openThisWindow();}Color chatMessageForegroundColor = Color.BLACK;public void setupForegroundColorButton_onClick(ActionEvent e) {Color userSelectColor =JColorChooser.showDialog(eventSourceContainer.getOneChatMainFrame(),"请选择您的文字的颜色",Color.black);if (userSelectColor != null) {chatMessageForegroundColor = userSelectColor;}SimpleAttributeSet oneSimpleAttributeSet = new SimpleAttributeSet();StyleConstants.setForeground(oneSimpleAttributeSet,chatMessageForegroundColor);eventSourceContainer.getSendInfoTextPane().setCharacterAttributes(oneSimpleAttributeSet, false); //不覆盖其他的属性项目}public void insertImageFileButton_onClick(ActionEvent e) {String userSelectedImageFileName = null;userSelectedImageFileName = eventSourceContainer.getSelectedImageFile();eventSourceContainer.insertImageFileToSendInfoTextPane(new ImageIcon(userSelectedImageFileName));}public void returnKeySendMessageMenuItem_onClick(ActionEvent e) {}public void ctrlAndReturnKeySendMessageMenuItem_onClick(ActionEvent e) {}public void messagePatternMenuItem_onClick(ActionEvent e) {}public void selfDefineFontButton_onClick(ActionEvent e) {FontChooserDialog oneFontChooserDialog=new FontChooserDialog(null,true,null); //参数true代表为模式对话框oneFontChooserDialog.setAlwaysOnTop(true);oneFontChooserDialog.setVisible(true);Font returnUserSelectedFont=oneFontChooserDialog.getUserSelectFontInThisDialog();SimpleAttributeSet oneSimpleAttributeSet = new SimpleAttributeSet();StyleConstants.setFontFamily(oneSimpleAttributeSet, returnUserSelectedFont.getFamily());StyleConstants.setFontSize(oneSimpleAttributeSet, returnUserSelectedFont.getSize());if(returnUserSelectedFont.isBold()){StyleConstants.setBold(oneSimpleAttributeSet, true);}else if(returnUserSelectedFont.isItalic()){StyleConstants.setItalic(oneSimpleAttributeSet, true);}else if(returnUserSelectedFont.isPlain()){StyleConstants.setBold(oneSimpleAttributeSet, false);StyleConstants.setItalic(oneSimpleAttributeSet, false);}else if((returnUserSelectedFont.isBold())&&(returnUserSelectedFont.isItalic())){ StyleConstants.setBold(oneSimpleAttributeSet, true);StyleConstants.setItalic(oneSimpleAttributeSet, true);}eventSourceContainer.getSendInfoTextPane().setCharacterAttributes(oneSimpleAttributeSet, false); //不覆盖其他的属性项目}}2、ChatMainFrame_ItemListenerEventHandler(1)类名称为ChatMainFrame_ItemListenerEventHandler,包名称为com.px1987.imsystem.client.frame.chatframe.event,实现java.awt.event.ItemListener接口(2)编程该事件类package com.px1987.imsystem.client.frame.chatframe.event;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import ng.reflect.InvocationTargetException;import ng.reflect.Method;import javax.swing.text.SimpleAttributeSet;import javax.swing.text.StyleConstants;import com.px1987.imsystem.client.frame.chatframe.panel.ChatMainFrame_CenterInfoPanel; public class ChatMainFrame_ItemListenerEventHandler implements ItemListener { private ChatMainFrame_CenterInfoPanel eventSourceContainer = null;private String eventHandlerMethodName = null;public ChatMainFrame_ItemListenerEventHandler() {super();}public ChatMainFrame_ItemListenerEventHandler(ChatMainFrame_CenterInfoPaneleventSourceContainer, String eventHandlerMethodName) { super();this.eventSourceContainer = eventSourceContainer;this.eventHandlerMethodName = eventHandlerMethodName;}@SuppressWarnings("unchecked")public void itemStateChanged(ItemEvent itemEventObject) {Class currentEventHandlerClass = this.getClass();Method eventHandlerMmethod = null;try { //获得事件处理方法eventHandlerMmethod = currentEventHandlerClass.getMethod(this.eventHandlerMethodName, new Class[] {itemEventObject.getClass()});} catch (SecurityException exception) {exception.printStackTrace();System.out.println("出现了SecurityException异常错误,错误信息为:" +exception.getMessage());} catch (NoSuchMethodException exception) {exception.printStackTrace();System.out.println("出现了NoSuchMethodException异常错误,错误信息为:" + exception.getMessage());}try { //调用指定的事件处理方法eventHandlerMmethod.invoke(this, new Object[] {itemEventObject});} catch (InvocationTargetException exception) {exception.printStackTrace();System.out.println("出现了InvocationTargetException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalArgumentException exception) {exception.printStackTrace();System.out.println("出现了IllegalArgumentException异常错误,错误信息为:" + exception.getMessage());} catch (IllegalAccessException exception) {exception.printStackTrace();System.out.println("出现了IllegalAccessException异常错误,错误信息为:" +exception.getMessage());}}public void fontColorFormatButton_itemStateChanged(ItemEvent e) {if(eventSourceContainer.getSendMessageToolBar().getFontColorFormatButton().isSelected()) { eventSourceContainer.getCenterDownButtonPanel().add(eventSourceContainer.getFontSetupToolBar(),java.awt.BorderLayout.SOUTH);} else {eventSourceContainer.getCenterDownButtonPanel().remove(eventSourceContainer.getFontSetupToolBar());}eventSourceContainer.invalidate();eventSourceContainer.repaint();eventSourceContainer.validate();}public void fontSizeJComboBox_ItemListener(ItemEvent e) {int fontSize = Integer.parseInt( (String) eventSourceContainer.getFontSetupToolBar().getFontSizeJComboBox().getSelectedItem());SimpleAttributeSet oneSimpleAttributeSet = new SimpleAttributeSet();StyleConstants.setFontSize(oneSimpleAttributeSet, fontSize);eventSourceContainer.getSendInfoTextPane().setCharacterAttributes(oneSimpleAttributeSet, false); //不覆盖其他的属性项目}public void fontNameJComboBox_ItemListener(ItemEvent e) {String fontName = (String) eventSourceContainer.getFontSetupToolBar().getFontNameJComboBox().getSelectedItem();SimpleAttributeSet oneSimpleAttributeSet = new SimpleAttributeSet();StyleConstants.setFontFamily(oneSimpleAttributeSet, fontName);eventSourceContainer.getSendInfoTextPane().setCharacterAttributes(oneSimpleAttributeSet, false); //不覆盖其他的属性项目}/*在JTextPane中常用到属性类:SimpleAttributeSet和StyleConstant。
Java中基于TCPsocket的一对一简单聊天室
江苏经贸职业技术学院信息技术学院2015-2016-2学年《网络编程技术(java)》课程期末大作业2016年4月一、程序功能简介本程序拥有图形界面和一对一聊天程序,实现监听连接、发送、退出功能。
先启动Server服务器端程序进行端口监听,然后启动Client客户端连接Server端IP地址和端口号,Server端监听到后显示连接成功,可以进行通信。
二、运行界面截图(一)界面主程序(二)客户端程序三、核心代码说明(一)Client.java核心代码说明示例package gwd;import java.awt.*;import java.awt.event.*;import java.io.*;import .InetAddress;import .InetSocketAddress;import .Socket;import .UnknownHostException;import javax.swing.*;import javax.swing.border.EmptyBorder;public class Client extends JFrame implements Runnable, ActionListener, KeyListener {private static final long serialVersionUID = 8518610966119429018L;private JScrollPane textPane;//滚动条private JLabel pcLabel,portLabel;//标签private JTextArea chatArea;//聊天内容区域private JTextField pctextField,porttextField,sendField;//文本框private JButton connectButton,sendButton;//按钮private Socket socket;//客户端套接字对象private DataInputStream in;//数据输入流对象private DataOutputStream out;//数据输出流对象private Thread thread;//线程private JComboBox namecomboBox;//下拉列表框public Client() {createUserInterface();//调用图形界面setTitle("客户端");//设置标题setSize(550,500);//设置宽度和高度setResizable( false );//禁用界面最大化setLocationRelativeTo(null);//自动释放大小setVisible(true);//窗口显示出来setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭默认关闭窗口}public void createUserInterface() {setLayout(null);//设置布局JPanel contentPane=new JPanel();//创建顶部panelcontentPane.setBounds(5, 5, 525 , 50);//设置panel坐标add(contentPane);//添加控件到窗口屏幕中pcLabel = new JLabel("主机:");//创建主机标签contentPane.add(pcLabel);pctextField = new JTextField();//创建主机文本框contentPane.add(pctextField);pctextField.setColumns(10);portLabel = new JLabel("端口");//创建端口标签contentPane.add(portLabel);porttextField = new JTextField();//创建端口文本框porttextField.setColumns(10);contentPane.add(porttextField);namecomboBox = new JComboBox();//创建下拉列表框namecomboBox.addItem( "张三" );//设置值namecomboBox.addItem( "李四" );//设置值namecomboBox.setSelectedIndex( 0 );namecomboBox.setEditable(true);//设置允许选择contentPane.add(namecomboBox);chatArea = new JTextArea();//创建聊天内容区域chatArea.setLineWrap(true); //设置换行textPane = new JScrollPane(chatArea);//滚动条textPane.setBounds(5, 60, 525, 360);add(textPane);sendButton = new JButton("发送");//创建发送按钮sendButton.setBounds(355, 430, 80, 24);sendButton.addKeyListener(this);//绑定发送按钮键盘对象sendButton.addActionListener(this);//绑定发送按钮点击对象add(sendButton);sendField = new JTextField(255);//创建发送文本框sendField.setBounds(5, 430, 330, 24);sendField.addKeyListener(this);//发送文本框绑定键盘事件add(sendField);connectButton = new JButton("连接");//创建连接按钮connectButton.setBounds(450, 430, 80, 24);connectButton.addActionListener(this);//绑定连接按钮对象contentPane.add(connectButton);socket = new Socket();//创建客户端Sokcet对象thread = new Thread(this);//创建线程对象}public void connect() { //创建客户端Socket套接字try {if (!socket.isConnected()) { //判断套接字是否连接成功InetAddress address = InetAddress.getByName(pctextField.getText());//获取本地IP地址对象InetSocketAddress socketAddress = new InetSocketAddress(address, Integer.parseInt(porttextField.getText()));//创建InetSocketAddress对象socket.connect(socketAddress);//连接服务器in = new DataInputStream(socket.getInputStream());//创建数据输入流对象out = new DataOutputStream(socket.getOutputStream());//创建数据输出流对象sendButton.setEnabled(true);//启动发送按钮if (!(thread.isAlive())) { //判断线程是否激活thread = new Thread(this);//创建线程对象}thread.start();//启动线程}} catch (Exception e) {System.out.println(e);socket = new Socket();//创建Socket对象}}public void send() { //向客户端发送消息String msg = sendField.getText().trim();//获取发送消息内容if (msg.isEmpty()) { //判断是否为空JOptionPane.showMessageDialog(this, "请输入发送消息.");//提示消息return;}chatArea.append(namecomboBox.getSelectedItem()+": " + msg + "\n");//追加文本到聊天内容区域中try {out.writeUTF(namecomboBox.getSelectedItem()+": "+msg);//发送消息到客户端sendField.setText("");//清空消息} catch (Exception e) {e.printStackTrace();}}public void actionPerformed(ActionEvent arg0) { //点击事件if (arg0.getSource() == sendButton) { //发送按钮send();//发送消息} else if (arg0.getSource() == connectButton) { //连接对象connect();//启动客户端套接字对象}}public void run() { //启动线程if (Thread.currentThread() == thread) { //判断是否当前线程String msg = null;while (true) { //循环接收客户端消息try {msg = in.readUTF();//将数据读取出来chatArea.append("服务器: " + msg + "\n");//显示文本域中} catch (IOException e) {e.printStackTrace();socket = new Socket();break;}}}}public void keyPressed(KeyEvent arg0) { // 键盘按下if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {send();//发送消息}}Overridepublic void keyReleased(KeyEvent arg0) {}Overridepublic void keyTyped(KeyEvent arg0) {}public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {Client frame = new Client();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}}二、Server.java核心代码说明示例package gwd;import java.awt.*;import javax.swing.*;import javax.swing.border.EmptyBorder;import java.awt.event.*;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class Server extends JFrame implements Runnable, ActionListener, KeyListener {private JScrollPane textPane;//滚动条private JLabel portLabel;//标签private JTextArea chatArea;//聊天内容区域private JTextField portField,sendField;//文本框private JButton sendButton,startButton;//按钮private ServerSocket serversocket;//服务器套接字对象private Socket socket;//客户端套接字对象private DataInputStream in;//数据输入流对象private DataOutputStream out;//数据输出流对象private Thread thread;//线程public Server() {createUserInterface();//调用图形界面setTitle("服务器");//设置标题setSize(550,500);//设置宽度和高度setResizable( false );//禁用界面最大化setLocationRelativeTo(null);//自动释放大小setVisible(true); //显示出来setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭默认关闭窗口}public void createUserInterface() {setLayout(null);//设置布局JPanel contentPane=new JPanel();//创建顶部panelcontentPane.setBounds(5, 5, 525, 50);//设置panel坐标add(contentPane);portLabel = new JLabel("端口");//创建端口标签contentPane.add(portLabel);portField = new JTextField();//创建端口文本框contentPane.add(portField);portField.setColumns(10);chatArea = new JTextArea();//创建聊天内容区域chatArea.setLineWrap(true);//设置换行textPane = new JScrollPane(chatArea);//滚动条textPane.setBounds(5, 60, 525, 360);add(textPane);sendButton = new JButton("发送");//创建发送按钮sendButton.setBounds(355, 430, 80, 24);sendButton.addActionListener(this);//绑定发送按钮点击对象add(sendButton);sendField = new JTextField(255);//创建发送文本框sendField.setBounds(5, 430, 330, 24);sendField.addKeyListener(this);//消息框绑定键盘事件监听add(sendField);startButton = new JButton("启动");//创建启动按钮startButton.setBounds(450, 430, 80, 24);startButton.addActionListener(this);//绑定启动按钮对象contentPane.add(startButton);thread = new Thread();//创建线程对象}public void connect() { //创建服务器ServerSocket套接字try {chatArea.append("请稍等...\n");//添加文本到聊天内容区域中serversocket = new ServerSocket(Integer.parseInt(portField.getText()));//创建ServerSocket 套接字对象socket = serversocket.accept();//接收客户端套接字对象chatArea.append("连接成功... \n");//追加信息到聊天内容区域中,显示成功连接服务器in = new DataInputStream(socket.getInputStream());//创建数据输入流对象out = new DataOutputStream(socket.getOutputStream());//创建数据输出流对象if (!thread.isAlive()) { //判断线程是否激活thread = new Thread(this);//创建线程对象}thread.start();//启动线程} catch (Exception e) {System.out.println(e);try {serversocket = new ServerSocket();//创建ServerSocket 套接字对象} catch (IOException e1) {e1.printStackTrace();}}}public void send() { //向客户端发送消息String msg = sendField.getText().trim();//获取发送消息内容if (msg.isEmpty()) { //判断是否为空JOptionPane.showMessageDialog(this, "请输入发送消息.");//提示消息return;}chatArea.append("服务器: " + msg + "\n");//追加文本到聊天内容区域中try {out.writeUTF(msg);//发送消息到客户端sendField.setText("");} catch (Exception e) {e.printStackTrace();}}public void actionPerformed(ActionEvent arg0) { //键盘事件if (arg0.getSource() == sendButton) { //发送按钮send();//发送消息} else if (arg0.getSource() == startButton) { //连接对象connect();//启动服务器套接字对象}}public void run() { //启动线程if (Thread.currentThread() == thread) { //判断是否当前线程String msg = null;while (true) { //循环接收客户端消息try {msg = in.readUTF();//将数据读取出来chatArea.append(msg + "\n");//显示在聊天内容区域中} catch (IOException e) {e.printStackTrace();try {serversocket = new ServerSocket(4331);} catch (IOException e1) {e1.printStackTrace();}break;}}}}public void keyPressed(KeyEvent arg0) { // 键盘按下if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {send();//发送消息}}Overridepublic void keyReleased(KeyEvent arg0) {}Overridepublic void keyTyped(KeyEvent arg0) {}public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {Server frame = new Server();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}}四、创新点说明本程序基于TCPsocket实现网络即时通信,客户端可用多种身份与服务器端聊天,方便、快捷、易懂。
实现一对一的聊天程序1
XXXXX大学XXXXXXXX学院计算机网络与通信实习程设计报告设计题目实现一对一的聊天程序学生专业班级学生姓名(学号)指导教师完成时间 2010-5-20实习(设计)地点理信学院机房112、1392010 年 5 月 20 日一、原理概述1、开发平台:Windows XP, Visual C++2、系统简单描述:这是一个用VC做的简单的聊天系统。
在此系统中,采用TCP协议,程序分为服务器端各客户端。
系统能实现简单的聊天室功能包括一对多,而且同时也支持一对一,即私聊功能。
在系统运行中,用户可以随时更改自己的用户名。
功能虽然单一但也能够满足聊天的基本功能。
3、通信规范的制作:程序中定义了一个结构体MYMESSAGE来作为信息传送的载体struct MESSAGE {//send(dlg->clisock,"D" , 10,0);dlg->(false);dlg->(true);dlg->(false);closesocket(dlg->clisock);AfxEndThread(0);return 0;}1.客户端发送函数void CCharClientDlg::OnButtonSend(){MESSAGE MsgBuff;char text[20];gethostname,10);strcat, "说: ");(text, 90);strcat, text);("");(count++,;send(clisock, (char*)&MsgBuff, sizeof(MESSAGE), 0);}2.服务器端发送线程:UINT thread(LPVOID p){//char buff[100];MESSAGE MsgBuff;int s = 1, msgcount , flag =0;CChatDlg *dlg = (CChatDlg*)AfxGetApp()->GetMainWnd();msgcount = dlg->getcount();if (msgcount != -1) {s = 1;dlg->msgsock[msgcount] = accept(dlg->sock, (sockaddr*)&(dlg->serv), &(dlg->addlen));if (dlg->msgsock[msgcount] == INVALID_SOCKET) {dlg->("Error accept");}else{strcpy(dlg->ipaddr[msgcount], inet_ntoa(dlg->);strcat(dlg->ipaddr[msgcount], ":");sprintf(dlg->ipaddr[msgcount]+strlen(inet_ntoa(dlg->)+1,"%d",dlg->;= 'A';//增加新的链接dlg->sendList(dlg->msgsock[msgcount],MsgBuff);//把列表都发给它dlg->updateList(dlg->ipaddr[msgcount],true);//更IP列表strcpy, dlg->ipaddr[msgcount]);dlg->sendtoall(dlg->msgsock[msgcount], (char*)&MsgBuff);//把新加入的用户IP发给所用用户dlg->(dlg->count++, inet_ntoa(dlg->);dlg->(true);AfxBeginThread(thread, 0);//开始一个新的接受连接线程while (s != SOCKET_ERROR) {s=recv(dlg->msgsock[msgcount], (char*)&MsgBuff ,sizeof(MESSAGE), 0);if(s != SOCKET_ERROR){//if(strcmp(buff, "DisconnectedClient") != 0)if == 'D'){//删除信息dlg->updateList(dlg->ipaddr[msgcount], false);// 发出删除信息strcpy, dlg->ipaddr[msgcount]);dlg->(dlg->count++,strcat(dlg->ipaddr[msgcount], "断开链接"));dlg->ipaddr[msgcount][0]='\0';int i =dlg->();dlg->sendtoall(dlg->msgsock[msgcount], (char*)&MsgBuff);}else if == 'P') {for (int i=0; i<20; i++) {if(strcmp, dlg->ipaddr[i]) == 0) {break;}}send(dlg->msgsock[i], (char*)&MsgBuff, sizeof(MESSAGE), 0);}else{//普通信息dlg->sendtoall(dlg->msgsock[msgcount], (char*)&MsgBuff);dlg->(dlg->count++, ;}}}= 'D';send(dlg->msgsock[msgcount],(char*)&MsgBuff,sizeof(MESSAGE) ,0);dlg->msgsock[msgcount] = NULL;//归还套接字资源for (int i= 0; i<20; i++) {if(dlg->msgsock[msgcount] != NULL)flag = 1;}if(flag != 1)dlg->(false);closesocket(dlg->msgsock[msgcount]);}}AfxEndThread(0);return 0;}四、运行结果服务器界面如下:客户端界面如下:五、实习心得和体会这次实验使我明白了整个网络连接,通信,断开的过程,使我增加了对网络编程的理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c++/MFC CSocket仿QQ聊天软件,实现1对1聊天,群聊分类:c++ 2012-11-25 16:45 1582人阅读评论(13) 收藏举报c++C++mfcMFCqqQQsocket聊天学习,c++有2个星期了。
本来,本人是做php出身的。
做php快2年了,最近身边多了很多高手。
让自己对c开始感兴趣了,就开始学习c++了。
首先接触的就是mfc。
前几天,看到了一个博文,是有关,mfc网络编程的。
可对方,的实例只能是多对多,出于兴趣,自己改写了下它的程序,实现了点对点的聊天。
所以,本实例并非纯原创的。
这个还请大家见谅,尤其是作者。
我在他程序基础上,增加了1对1的聊天,同时还保留了群聊。
而且,最关键的是,我增加了很多备注。
很适合新手学习。
本人也是新手,还请各位高手提出宝贵建议。
先谢谢大家了。
如果要转载请注明原地址:/open520yin/article/details/8222279实例下载地址:/detail/open520yin/4808903(为了自己能有点下载积分,客户端和服务端一起打包5个积分不算贵吧。
呵呵。
)大家要是想看懂这个可能还需要先了解一下mfc的socket的一些基本使用规则我也有一篇博文写了c++/MFC 极为简单的socket实例:/open520yin/article/details/8202465MFC的CSocket编程,利用CSocket实现一个基于TCP实现一个QQ聊天程序。
///////////////////////////////////////////////////////////////////////// 服务端start ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////先讲讲服务端,一切先从服务端开始:首先就是要使用AfxSocketInit初始化winsocket,[cpp]view plaincopyprint?1. //初始化winSock库,成功则返回非0否则返回02. WSAData wsData;3. if(!AfxSocketInit(&wsData))4. {5. AfxMessageBox(_T("Socket 库初始化出错!"));6. return false;7. }m_iSocket 是一个CServerSocket*的指针 ,CServerSocket类是一个我们自己的类我会在后面给出相应代码,他继承于CSocket类。
[cpp]view plaincopyprint?1. //创建服务器端Socket、采用TCP2. m_iSocket = new CServerSocket();3. if(!m_iSocket)4. {5. AfxMessageBox(_T("动态创建服务器套接字出错!"));6. return false;7. }实例socket好了,就要创建套接字了。
这里的端口要和客户端连接的端口一致,不然就连接不上。
而且,这个端口,要和服务器的其他软件端口不能冲突,怎么去判断冲突,可以自己谷歌一下,很简单的。
我这里就直接写死了,这个端口一般不会被占用的。
[cpp]view plaincopyprint?1. //端口使用89892. if(!m_iSocket->Create(8989))3. {4. AfxMessageBox(_T("创建套接字错误!"));5. m_iSocket->Close();6. return false;7. }创建好了就要,开始监听这个端口了。
这个是一般的,socket必须建立的几个过程。
[cpp]view plaincopyprint?1. if(!m_iSocket->Listen())2. {3. AfxMessageBox(_T("监听失败!"));4. m_iSocket->Close();5. return false;6. }走完上面的几个步骤,这样,服务端,就能和客户端接受和发送消息了。
大家可能会很奇怪,上面那个怎么没有绑定端口,直接listen了。
这个我那个简单socket里有介绍,因为,Create 方法已经包含了Bind 方法,如果是以Create 方法创建socket的前提下不能再调用Bind ,要不一定出错。
然后重载ExitInstance,退出时对进行清理[cpp]view plaincopyprint?1. int CNetChatServerApp::ExitInstance()2. {3. if(m_iSocket)4. {5. delete m_iSocket;6. m_iSocket = NULL;7. }8. return CWinApp::ExitInstance();9. }我再去看看上面用到的CServerSocket类,这个是用来,服务端接收消息用的。
开启了监听这里的OnAccept()方法就会一直被循环调用。
这个方法其实是重写CSocket类的OnAccept()方法。
只要socket开启了监听,OnAccept就会被循环调用,我那个简单的socket实例,是开启一个while进行死循环来达到这个目的。
大家不要介意,我也是新手。
这里OnAccept方法为什么能一直被循环执行,我到现在也没弄明白,如果有高手知道请告诉我下。
但是我知道,这里就是如果服务器有收到消息就会调用这里,提示ClientSocket接受消息。
[cpp]view plaincopyprint?1. void CServerSocket::OnAccept(int nErrorCode)2. {3. //接受到一个连接请求4. CClientSocket* theClientSock(0);5. //初始化在初始化里把m_listSockets赋值到m_pList里6. theClientSock = new CClientSocket(&m_listSockets);7. if(!theClientSock)8. {9. AfxMessageBox(_T("内存不足,客户连接服务器失败!"));10. return;11. }12. Accept(*theClientSock); //接受13. //加入list中便于管理,这个很关键14. m_listSockets.AddTail(theClientSock);15. CSocket::OnAccept(nErrorCode);16. }OnAccept收到消息,就会实例CClientSocket类,这里其实主要是,服务端发送消息和接受消息的主要部分。
也是服务端,最核心的部分。
OnAccept收到消息后,就会通知CClientSocket来接受消息。
注意了,CserverSocket是接收消息而CClientSocket是接收消息。
接收,接受还是有区别的。
这个关系我们要理解清楚。
这个是我自己的理解,不时候是否有错误。
还请高手赐教。
我学c++最多不过半个月,有些东西,都真是靠自己的理解。
下面的接受消息OnReceive 方法怎么调用的,我也有点模糊,这个方法好像是重写Socket的。
就有数据来,他就会自动调用。
m_listSockets.AddTail(theClientSock);这个很关键,m_listSockets是CPtrList类型,我对这个也还不太了解,经过我一些认识,这个是存放socket连接,成功一个就会加入这个,是一个链表。
用来存放所有连接到服务器的socket连接的,这个后面会经常用到。
下面的HEADER是一个结构体,定义如下[cpp]view plaincopyprint?1. typedef struct tagHeader{2. int type ;//协议类型3. int nContentLen; //将要发送内容的长度4. char to_user[20];5. char from_user[20];6. }HEADER ,*LPHEADER;这个结构体,要和客户端保持一致,不然我担心会有问题。
就算没有问题,我估计转换也麻烦。
尽量保持一直吧,这个也算是一种协议吧。
客户端传输的时候,也传递这样的结构体。
下面的方法,具体就看看备注吧。
我在备注里讲解了。
但是注意的是,我们客户端发送消息,是一次发送2个消息,先发送一个头部消息,这个头部消息是一个结构体,是服务端和客户端一种自定义的协议。
这样的好处是,能节约资源,并且提前知道内容的长度进行申请内存空间。
能先知道对应的消息类型,然后再进行转换和读取。
这个头部接受好了,然后再去接受正式的数据。
这个,可能你去看看。
服务端可能会更容易了解。
[cpp]view plaincopyprint?1. void CClientSocket::OnReceive(int nErrorCode)2. {3. //有消息接收4. //先得到信息头5. HEADER head; //定义客户端发送的过来的一样的结构体6. int nlen = sizeof HEADER; //计算结构体大小7. char *pHead = NULL; //用于接受的结构体8. pHead = new char[nlen]; //申请和结构体一样大小的内存空间9. if(!pHead)10. {11. TRACE0("CClientSocket::OnReceive 内存不足!");12. return;13. }14. memset(pHead,0, sizeof(char)*nlen ); //初始化15. Receive(pHead,nlen); //收到内容,并赋值到pHead中,指定接受的空间大小16. //以下是将接收大结构体进行强制转换成我们的结构体,17. head.type = ((LPHEADER)pHead)->type;18. head.nContentLen = ((LPHEADER)pHead)->nContentLen;19. //head.to_user 是char[]类型,如果不进行初始化,可能会有乱码出现20. memset(head.to_user,0,sizeof(head.to_user));21. //讲接受的数据转换过后并赋值到head.to_user,以下同22. strcpy(head.to_user,((LPHEADER)pHead)->to_user);23. memset(head.from_user,0,sizeof(head.from_user));24. strcpy(head.from_user,((LPHEADER)pHead)->from_user);25.26.27. delete pHead; //使用完毕,指针变量的清除28. pHead = NULL;29.30. //再次接收,这次是接受正式数据内容31. //这个就是,头部接受到的内容长度,这样能对应的申请内容空间32. pHead = new char[head.nContentLen];33. if(!pHead)34. {35. TRACE0("CClientSocket::OnRecive 内存不足!");36. return;37. }38. //这里是一个验证,防止内存错误。