比较安全,tcp上还加了俩层
简单聊一下socket
socket:套接字,连接需要ip
和端口
,分为tcp和udp两种形式
asmack github:https://github.com/Flowdalic/asmack
asmack下载地址1:http://asmack.freakempire.de/
asmack下载地址2:http://code.google.com/p/asmack/downloads/list
openfire下载地址:http://www.igniterealtime.org/downloads/index.jsp
smack使用指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html
http://www.igniterealtime.org/
中文简体
内嵌数据库
itheima
admin admin。帐号就是这个,没有@xxx那些
xmpp版即使聊天的核心:其实就是熟悉asmack.jar里面的一些常见类.以及常见监听器;
http://asmack.freakempire.de/
ThreadUtils的封装.
public class ThreadUtils {
/**
* 子线程执行task
*/
public static void runInThread(Runnable task) {
new Thread(task).start();
}
/**
* 创建一个主线程中handler
*/
public static Handler mHandler = new Handler();
/**
* UI线程执行task
*/
public static void runInUIThread(Runnable task) {
mHandler.post(task);
}
}
public class {
/**
* 可以在子线程中弹出toast
*
* @param context
* @param text
*/
public static void showToastSafe(final Context context, final String text) {
ThreadUtils.runInUIThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
});
}
}
SplashActivity
public class SplashActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// 停留3s,进入登录界面
ThreadUtils.runInThread(new Runnable() {
@Override
public void run() {
// 休眠3s
SystemClock.sleep(3000);
// 进入主界面
Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});
}
}
ButterKnife.jar
以及as的android-butterknife-zelezny
插件// 设置常见的参数 config.setDebuggerEnabled(true);// 开启调试模式,可以看到传输的xml config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);//明文传输
public class LoginActivity extends ActionBarActivity {
public static final String HOST = "192.168.1.100"; // 主机ip
public static final int PORT = 5222; // 对应的端口号
public static final String SERVICENAME = "itheima.com";
private TextView mEtUserName;
private TextView mEtPassWord;
private Button mBtnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
initListener();
}
private void initListener() {
mBtnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String userName = mEtUserName.getText().toString();
final String passWord = mEtPassWord.getText().toString();
// 判断用户名是否为空
if (TextUtils.isEmpty(userName)) {// 用户名为空,系统自带的textview的属性,弹出悬浮窗提示
mEtUserName.setError("用户名不能为空");
return;
}
// 判断密码是否为空
if (TextUtils.isEmpty(passWord)) {// 用户名为空
mEtPassWord.setError("密码不能为空");
return;
}
ThreadUtils.runInThread(new Runnable() {
@Override
public void run() {
try {
// 1.创建连接配置对象
ConnectionConfiguration config = new ConnectionConfiguration(HOST, PORT);
// 额外的配置(方面我们开发,上线的时候,可以改回来)
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);// 明文传输
config.setDebuggerEnabled(true);// 开启调试模式,方便我们查看具体发送的内容
// 2.开始创建连接对象
XMPPConnection conn = new XMPPConnection(config);
// 开始连接
conn.connect();
// 连接成功了
// 3.开始登录
conn.login(userName, passWord);
// 已经成功成功
ToastUtils.showToastSafe(LoginActivity.this, "登录成功");
finish();
// 跳到主界面
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
// 需要保存连接对象
IMService.conn = conn;
//启动IMService
Intent service = new Intent(LoginActivity.this, IMService.class);
startService(service);
} catch (XMPPException e) {
e.printStackTrace();
ToastUtils.showToastSafe(LoginActivity.this, "登录失败");
}
}
});
}
});
}
private void initView() {
mEtUserName = (TextView) findViewById(R.id.et_username);
mEtPassWord = (TextView) findViewById(R.id.et_password);
mBtnLogin = (Button) findViewById(R.id.btn_login);
}
}
ToolBarUtil
public class ToolBarUtil {
private List<TextView> mTextViews = new ArrayList<TextView>();
public void createToolBar(LinearLayout container, String[] toolBarTitleArr, int[] iconArr) {
for (int i = 0; i < toolBarTitleArr.length; i++) {
TextView tv = (TextView) View.inflate(container.getContext(), R.layout.inflate_toolbar_btn, null);
tv.setText(toolBarTitleArr[i]);
// 动态修改textView里面的drawableTop属性
tv.setCompoundDrawablesWithIntrinsicBounds(0, iconArr[i], 0, 0);
int width = 0;
int height = LinearLayout.LayoutParams.MATCH_PARENT;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, height);
//设置weight属性
params.weight = 1;
container.addView(tv, params);
//保存textView到集合中
mTextViews.add(tv);
//设置点击事件
final int finalI = i;
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//不同模块之间传值需要用接口回调
//3.需要传值的地方.用接口对象调用接口方法
mOnToolBarClickListener.onToolBarClick(finalI);
}
});
}
}
public void changeColor(int position) {
//还原所有的颜色
for (TextView tv : mTextViews) {
tv.setSelected(false);
}
mTextViews.get(position).setSelected(true);//通过设置selected属性,控制为选中效果
}
//1.创建接口和接口方法
public interface OnToolBarClickListener{
void onToolBarClick(int position);
}
//2.定义接口变量
OnToolBarClickListener mOnToolBarClickListener;
//4.暴露一个公共的方法
public void setOnToolBarClickListener(OnToolBarClickListener onToolBarClickListener) {
mOnToolBarClickListener = onToolBarClickListener;
}
}
MainActivity
public class MainActivity extends ActionBarActivity {
@InjectView(R.id.main_tv_title)
TextView mMainTvTitle;
@InjectView(R.id.main_viewpager)
ViewPager mMainViewpager;
@InjectView(R.id.main_bottom)
LinearLayout mMainBottom;
// xutils viewutils 注解方式去找控件
// viewutils httpUitls dbutils bitmaputils
//
private List<Fragment> mFragments = new ArrayList<Fragment>();
private ToolBarUtil mToolBarUtil;
private String[] mToolBarTitleArr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
initData();
initListener();
}
private void initListener() {
mMainViewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// 修改颜色
mToolBarUtil.changeColor(position);
// 修改title
mMainTvTitle.setText(mToolBarTitleArr[position]);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mToolBarUtil.setOnToolBarClickListener(new ToolBarUtil.OnToolBarClickListener() {
@Override
public void onToolBarClick(int position) {
mMainViewpager.setCurrentItem(position);
}
});
}
private void initData() {
// viewPager-->view-->pagerAdapter
// viewPager-->fragment-->fragmentPagerAdapter-->fragment数量比较少
// viewPager-->fragment-->fragmentStatePagerAdapter
// 添加fragment到集合中
mFragments.add(new SessionFragment());
mFragments.add(new ContactsFragment());
mMainViewpager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
// 底部按钮
mToolBarUtil = new ToolBarUtil();
// 文字内容
mToolBarTitleArr = new String[] { "会话", "联系人" };
// 图标内容
int[] iconArr = { R.drawable.selector_meassage, R.drawable.selector_selfinfo };
mToolBarUtil.createToolBar(mMainBottom, mToolBarTitleArr, iconArr);
// 设置默认选中会话
mToolBarUtil.changeColor(0);
}
class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return 2;
}
}
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有