`

即时通信学习笔记

阅读更多

下载安装文件
openfire_3_6_4.exe
spark_2_5_8_exe.exe
org.jivesoftware.smack_3.1.0.jar


源代码下载路径
http://svn.igniterealtime.org/svn/repos/openfire/trunk


搭建openfire服务器
C:\WINDOWS\system32\drivers\etc\hosts文件,增加一新行:
127.0.0.1 cn.yue.com


安装
openfire_3_6_4.exe


创建openfire运行时所需数据库
C:\Program Files\Openfire\resources\database
我们使用mysql
找到openfire_mysql.sql
创建数据库


注:
如果使用sqlserver数据库,需要添加sqlserver 的jdbc驱动包放到/lib目录下




运行/bin/openfire.exe
launch admin---> 简体中文continue-->输入域名(cn.yue.com)
--->标准数据库连接-->数据库配制--->初始设置-->创建管理员账号--->完成




查看ofuser就可以看到同刚才创建的管理员账号


重启openfire后,登陆管理页面


windows 服务端反搭建完成
==================================================================
搭建客户端测试openfire服务器


连接openfire服务器
注册用户
在不同有基于xmpp协议定的客户端进行添加好友和发送即时消息




安装spark2.5.8.exe
======================================================================
即时消息android 客户端
下载asmack-2010.05.07.jar
新建工程
1 登录
/**
* 联接服务器工具类
*
* @time 下午2:44:28
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class ConnectUtil {
private static XMPPConnection connection = null;


public ConnectUtil() {
}


public static void openConnection() {
ConnectionConfiguration configuration = new ConnectionConfiguration("192.168.1.5", 5222);
connection = new XMPPConnection(configuration);
try {
connection.connect();
} catch (XMPPException e) {
e.printStackTrace();
Mylog.i("tag", "联接服务器失败!" + e.toString());
}
}


/**
* 建立联接 取得connection对象
*
* @return
*/
public static XMPPConnection getConnection() {
if (connection == null) {
openConnection();
}
return connection;
}


/**
* 关闭联接
*/
public static void closeConnection() {
if (connection != null) {
connection.disconnect();
connection = null;
}
}
}




/**
* 用户登录
*
* @time 下午10:00:42
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class LoginActivity extends BaseActivity implements OnClickListener {
private EditText etxt_userName;
private EditText etxt_pwd;


private UserService userService;
private User user;
private SharedPreferences sp;
private ProgressDialog progressDialog;
private String userName, pwd;
private boolean ispswd = false;
private String state;
private Handler handler = new Handler() {


@Override
public void handleMessage(Message msg) {
progressDialog.dismiss();
if (msg.what == Constants.LOGIN_SUCESS) {
Mylog.i("tag", "--------------------");
// 进入主页面
Intent intent = new Intent(state);
intent.putExtra("choseNum", Constants.TALKLIST_SHOW);
sendBroadcast(intent);


// 保存用户信息
sp = getSharedPreferences("survey", Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("userName", etxt_userName.getText().toString().trim());
editor.putString("pwd", etxt_pwd.getText().toString().trim());
editor.putBoolean("ispswd", ispswd);
editor.commit();


} else if (msg.what == Constants.LOGIN_FAILED) {
// 清空信息,登录失败
etxt_pwd.setText("");
etxt_userName.setText("");
etxt_userName.requestFocus();
Toast.makeText(LoginActivity.this, "用户名/密码错误!", Toast.LENGTH_LONG).show();


}
}


};


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
findView();
init();
// 是否自动登录
autoCheckin();
}


/**
* 初始化方法
*/
private void init() {
state = getIntent().getAction();


user = new User();
userService = new UserServiceImpl();
// 取得用户登录信息


sp = getSharedPreferences("survey", Context.MODE_PRIVATE);
String userName = sp.getString("userName", "test3");
String pwd = sp.getString("pwd", "123456");
etxt_userName.setText(userName);
etxt_pwd.setText(pwd);
user.setEmail(userName);
user.setPassword(pwd);
}


@Override
protected void onResume() {
setClazz(LoginActivity.class);
super.onResume();
}


/**
* 实例化控件
*/


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_btn_reg:// 用户注册
reg();


break;


case R.id.login_btn_checkin:// 登录
login();
break;
}
}


private void findView() {
etxt_userName = (EditText) this.findViewById(R.id.login_etxt_username);
etxt_pwd = (EditText) this.findViewById(R.id.login_etxt_pwd);


this.findViewById(R.id.login_btn_checkin).setOnClickListener(this);
this.findViewById(R.id.login_btn_reg).setOnClickListener(this);


}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Mylog.i("tag", "================" + resultCode);


if (resultCode == RESULT_FIRST_USER) {
Bundle bundle = data.getExtras();
// 回显用户信息
etxt_userName.setText(bundle.getString("userName"));
etxt_pwd.setText(bundle.getString("pwd"));
}
super.onActivityResult(requestCode, resultCode, data);
}


/******************** 业务方法 ********************************************************************/
/**
* 登录
*/
private void login() {
if (inputCheck()) {
progressDialog = ProgressDialog.show(LoginActivity.this.getParent().getParent(), "请稍等", "用户登录中...", true);
new LoginThread().start();
}


}


/**
* 检查用户输入合法性
*/


private boolean inputCheck() {
userName = etxt_userName.getText().toString();
if (!ValidateUtil.isValidate(userName)) {
Toast.makeText(LoginActivity.this, "请输入email!", Toast.LENGTH_SHORT).show();
etxt_userName.requestFocus();
return false;
}
pwd = etxt_pwd.getText().toString();
if (!ValidateUtil.isValidate(pwd)) {
Toast.makeText(LoginActivity.this, "请输入密码!", Toast.LENGTH_SHORT).show();
etxt_pwd.requestFocus();
return false;
}
user.setEmail(userName);
user.setPassword(pwd);
return true;
}


/**
* 注册
*/
private void reg() {
Intent intent = new Intent(state);
intent.putExtra("choseNum", Constants.REG_SHOW);
sendBroadcast(intent);
Toast.makeText(LoginActivity.this, "clicked register!", Toast.LENGTH_LONG).show();


// Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
// startActivityForResult(intent, Constants.LOGIN_RECORDER);
}


/**
* 用户登录线程
*/
private class LoginThread extends Thread {


@Override
public void run() {
xmppLogin();
}


}


/**
* 登录xmpp服务器
*/
private void xmppLogin() {
try {
Mylog.i("tag", "username:" + user.getEmail() + " pwd:" + user.getPassword());
// 登录服务器
ConnectUtil.getConnection().login(user.getEmail(), user.getPassword());
// 设置用户状态(在线状态)
Presence presence = new Presence(Presence.Type.available);
ConnectUtil.getConnection().sendPacket(presence);
handler.sendEmptyMessage(Constants.LOGIN_SUCESS);
} catch (XMPPException e) {
e.printStackTrace();
ConnectUtil.closeConnection();
handler.sendEmptyMessage(Constants.LOGIN_FAILED);
}


}


// TODO
@SuppressWarnings("unused")
private void Testlogin() {
// 调用userService登录
String result = userService.getEntity(user);
Mylog.i("tag", "result++++++++++++++++++++++" + result);
if (ValidateUtil.isValidate(result)) {
if (result.equals("success")) {
handler.sendEmptyMessage(Constants.LOGIN_SUCESS);
} else {
handler.sendEmptyMessage(Constants.LOGIN_FAILED);
}
}
}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
LocalUtils.exitConfirm(LoginActivity.this.getParent().getParent());
break;
}
return true;
}





/**
* 自动登录
*/
private void autoCheckin() {
if (ValidateUtil.isValidate(user.getEmail()) && ValidateUtil.isValidate(user.getPassword())) {
login();
}
}
}














======================================================================
mina下载路径
http://mina.apache.org/downloads.html
apache-mina-2.0.7-bin


传送字符串的简单c/s


所需jar包
mina-core-2.0.7.jar
slf4j-api-1.5.8.jar
slf4j-nop-1.5.8.jar




服务器端
示例代码如下
/**
* mina服务器端
*
* 启动服务器的主类
*
* @time 下午3:17:08
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class MinaServer {


/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 创建一个非阻塞的sserver端socket
SocketAcceptor acceptor = new NioSocketAcceptor();
// 创建接收数据的过滤器
DefaultIoFilterChainBuilder chainBuilder = acceptor.getFilterChain();
// 过滤器读取数据
chainBuilder.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));
// 设定服务器端的消息处理器
acceptor.setHandler(new SampleMinaServerHandler());
int bindPort = 9988;
// 服务器端邦定的端口
acceptor.bind(new InetSocketAddress(bindPort));


System.out.println("minaServer is starting!" + bindPort);
}
}


/**
* 消息处理器
*
* @time 下午3:18:57
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class SampleMinaServerHandler extends IoHandlerAdapter {
private int count = 0;


/**
* 客户端连接成功
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incomming client:" + session.getRemoteAddress());
}


/**
* 客户端关闭联接
*/
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("one client disconnect!");
}


/**
* 接收到客户端发送的消息
*/
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String msg = (String) message;
System.out.println("接收到客户端消息:" + msg);
// 回送消息给客户端
session.write(msg + count);
count++;
}


}






测试服务器端程序


命令行模式:
telnet localhost 9988
helloworld


服务器端信息
minaServer is starting!9988
incomming client:/127.0.0.1:31185
接收到客户端消息:hello world




代码实现客户端程序
/**
* mina客户端
*
* @time 下午4:04:27
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class MinaClient {


/**
* @param args
*/
public static void main(String[] args) {
//
NioSocketConnector connector = new NioSocketConnector();
// 创建过滤器
DefaultIoFilterChainBuilder chain = connector.getFilterChain();
// 设置过滤器读取数据方式
chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));


// 设置客户端的消息处理器
connector.setHandler(new SampleMinaServerHandler());
// 设置超时时间
connector.setConnectTimeout(3000);
// 连接到服务器
ConnectFuture future = connector.connect(new InetSocketAddress("localhost", 9988));
future.awaitUninterruptibly();
future.getSession().getCloseFuture().awaitUninterruptibly();
connector.dispose();
}


}




/**
* 客户端消息处理器
*
* @time 下午3:18:57
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class SampleMinaServerHandler extends IoHandlerAdapter {
private int count = 0;


/**
* 客户端连接成功
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("incomming client:" + session.getRemoteAddress());
session.write("client ====come on !");
}


/**
* 客户端关闭联接
*/
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("client ====one client disconnect!");
}


/**
* 接收到客户端发送的消息
*/
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String msg = (String) message;
System.out.println("接收到服务器端消息:" + msg);
// 回送消息给客户端
session.write(msg + count);
count++;
}


}


======================================================================



















分享到:
评论

相关推荐

    AVR学习笔记

    AVR学习笔记是一系列关于微控制器编程的教程,主要针对AVR系列的MCU,如ATmega16。这些笔记涵盖了从基础到进阶的应用,旨在帮助初学者和有一定经验的开发者更好地理解和应用AVR微控制器。以下是这些笔记中涉及的一些...

    java学习笔记-Scokect.pdf

    Java学习笔记-Scoket.pdf是关于Java编程语言中Socket编程的学习笔记,涵盖了Socket编程的基础知识、Java中Socket的使用、Socket通信的原理及应用等方面的内容。 Socket编程的基础知识 在Java编程语言中,Socket是...

    即时通讯(IM)系统完整源码+说明(免费IM系统(含单聊,群聊,聊天室等)).zip

    2、适用人群:主要针对计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、数学、电子信息等)的同学或企业员工下载使用,具有较高的学习借鉴价值。 3、不仅适合小白学习实战练习,也...

    IBM大型机操作系统学习笔记

    本文将基于“IBM大型机操作系统学习笔记”的标题和描述,深入探讨IBM大型机操作系统的关键知识点,包括登录流程、数据集管理、编辑器功能以及文件传输和用户间通信。 ### 登录与基础操作 登录IBM大型机需指定主机...

    Visual C++学习笔记

    ### Visual C++学习笔记知识点详解 #### 1. Win32API详解 Win32API是微软为其32位平台提供的应用程序编程接口(Application Programming Interface),适用于所有基于Win32平台运行的应用程序。通过调用Win32 API中...

    W1学习笔记--Communication1

    4. **通信 in realletter**:即时通信工具如电子邮件和即时消息在IT行业中扮演着重要角色,它们提供了快速、实时的交流途径,有助于提高工作效率。 5. **高效领导团队**:领导者的沟通技巧直接影响团队的效率。有效...

    LOTUS_NOTES学习笔记

    LOTUS_NOTES学习笔记主要涵盖了IBM的Lotus Domino和Lotus Notes这两个核心产品,以及相关的文件类型和系统配置。Lotus Domino是一款企业级的服务器软件,用于提供电子邮件、协作功能和自定义工作平台,而Lotus Notes...

    经典ajax学习笔记

    以下是一份详细的Ajax学习笔记,涵盖了其基本概念、工作原理、优势与限制,以及实际应用。 ### 一、基本概念 Ajax的核心是JavaScript对象XMLHttpRequest(XHR),它允许浏览器在后台与服务器进行通信,而不会打断...

    工作学习笔记.docx

    本文主要涵盖了嵌入式系统中蓝牙通信的相关知识点,包括流媒体技术、RS-485接口、OD门、蓝牙的数据速率提升(EDR)以及低功耗蓝牙(LE)的特点...理解这些知识点对于在嵌入式领域工作或学习蓝牙通信技术是至关重要的。

    python学习笔记(五)

    在本篇“Python学习笔记(五)”中,我们将深入探讨Python编程语言的高级特性,特别是结合使用Jupyter Notebook这一强大的交互式环境进行学习和开发。Jupyter Notebook是一款开源工具,它允许用户以文档的形式组织...

    Python学习笔记

    Python学习笔记中蕴含的知识点非常丰富,涵盖了Python编程语言的核心概念、语法规则、编程范式以及标准库的使用方法等。以下是对这些知识点的详细阐述。 首先,Python是一种半编译半解释型运行环境。Python代码在...

    USB学习笔记-SCSI命令.pdf

    USB学习笔记中涉及的主要知识点是SCSI(Small Computer System Interface)命令,这是USB存储设备(例如USB驱动器或闪存盘)与主机通信时使用的协议的一部分。SCSI是一种广泛使用的接口标准,允许不同类型的硬件设备...

    swift-ReactNative学习笔记

    4. **Playgrounds**: Swift的Playgrounds是实时调试和学习代码的好工具,可以即时查看代码运行结果。 5. **Swift Package Manager**: Swift提供了自己的包管理器,用于管理和分发代码库,简化依赖管理。 6. **App...

    基于golang的分布式百万级即时通讯系统.zip

    本项目"基于golang的分布式百万级即时通讯系统"利用Go语言的强大特性和高效性能,旨在构建一个能够处理百万级用户的实时通信平台。 【描述】基于golang开发的系统 Go语言,又称Golang,是由Google公司设计的一种...

    Tigase学习笔记整理

    Tigase是一款开源的XMPP服务器,用于构建即时通讯和实时协作系统。本文将深入探讨Tigase的核心组件...通过实现不同的接口和类,开发者可以创建自定义组件、插件,以及优化网络通信,从而打造出功能强大的XMPP解决方案。

    Ajax学习笔记

    ### Ajax学习笔记精要 #### 一、Ajax概述 ##### 1.1 什么是Ajax? Ajax,全称为Asynchronous JavaScript and XML(异步的JavaScript和XML),是一种用于改善网页应用性能的技术。它允许网页在无需重新加载整个...

    状态机学习笔记

    ### 状态机学习笔记 #### 基本概念与事件定义 在状态机的设计与实现过程中,事件扮演着至关重要的角色。一个事件是指能够瞬间触发状态机执行特定操作的动作,它可以携带参数,这些参数提供了有关事件的具体信息。...

Global site tag (gtag.js) - Google Analytics