首页 > 代码库 > 使用xsocket框架实现的Android即时通讯软件

使用xsocket框架实现的Android即时通讯软件


	通过Xsocket实现的Android微信,并不是特别完善,可以在上面进行修改,界面仿照微信进行开发的,Xstream实现XML的传输,可以改成JSON,包括系统的登录,添加好友,聊天,朋友圈啊等功能。使用Activity、intent、SharedPreferences、ContentProvider,BroadcastReceiver、Application、dialog等.

系统从总体上划分可以分为服务器端和客户端。

服务器端主要任务是信息的中转站,通过java和mysql实现,包括信息的接受和发送,数据的存储和转发。

     客户端包含用户的登陆,注册,聊天,朋友圈等功能,使用android和sqlite实现,主要是实现局域网内的用户的即时通信功能。

系统设计



服务器端示例 
定义一个handler类,implements相关接口
1、IDataHandler
2、IConnectHandler,
3、IdleTimeoutHandler
4、IConnectionTimeoutHandler.
当连接成功并收取到数据后,这个handler就会调用。当连接成功并受到数据后,这个handler将会被调用,实现以上接口的函数。
有两种方法启动服务,分别是run()和start().
如果关闭服务器,通过使用server的close()方法.


功能模块的实现

左边是第一次启动应用程序后,介绍本款软件的内容,如果版本更新也会出现此效果。
       右边是注册和登陆界面,实现了用户的注册和登陆功能。
      注册的会把用户信息存储在第一次启动建立的sqlite本地的数据库,然后把注册信息发送到服务器。服务器也会创建用户,当登陆的时候,使用xStream格式进行发送,把object对象转化为XML数据类型,服务器根据内容匹配确定是否可以登陆。


进入之后会进入类似微信
的界面,下面菜单中分别有微信,通讯录,发现,我。
首先介绍我,可以录入自己的信息,包括右边昵称、手机号、QQ号,性别、个人签名,同时可以进行修改。


        刚开始进去没有联系人,需要添加好友才可以进行聊天,需要点击通讯录右上角的添加好友,如果好友存在,提示好友存在,就会有还有提示请求已经发出请求,请等候,对方可以收到好友请求,双方在申请者列表中都有对方的姓名,如果对方同意添加你为好友,在通讯录中就会产出现双发的姓名。




可以试想双方的通信,如果再启动客户端也可以进行三方通信,可以使用表情的添加,以及记录的删除。





  这个是朋友圈,你可以给你的朋友发送信息,同时可以赞,也可以发表自己的评论,别人可以看到你发的评论。




服务器端主要源码:


package com.zkq.server;

import java.io.IOException;
import java.net.Socket;
import java.nio.BufferUnderflowException;
import java.nio.channels.ClosedChannelException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.xsocket.MaxReadSizeExceededException;
import org.xsocket.connection.IConnectHandler;
import org.xsocket.connection.IDataHandler;
import org.xsocket.connection.IDisconnectHandler;
import org.xsocket.connection.INonBlockingConnection;

import com.thoughtworks.xstream.XStream;
import com.zkq.dao.impl.PeronDaoImpl;
import com.zkq.model.ChatMsgEntity;
import com.zkq.model.MsgType;
import com.zkq.model.Person;
import com.zkq.model.User;
import com.zkq.server.XsocketServer.XServerTask;

public class EchoHandler implements IDataHandler, IConnectHandler,
		IDisconnectHandler {
	
	private static BManager bMan = new BManager();
	public static Map<INonBlockingConnection, String> clientList = new HashMap<INonBlockingConnection, String>();
	private XStream xStream=new XStream();
	@Override
	public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {
		// TODO 自动生成的方法存根
		System.out.println("ondisconnect"+nbc.getRemoteAddress()+":"+nbc.getRemotePort());
//		bMan.remove(nbc);
//		if (clientList.containsKey(nbc)) {
//			clientList
//		}
		return true;
	}
	
	
	@Override
	public boolean onConnect(INonBlockingConnection nbc) throws IOException,
			BufferUnderflowException, MaxReadSizeExceededException {
		// TODO 自动生成的方法存根
		System.out.println("onconnect"+nbc.getRemoteAddress()+":"+nbc.getRemotePort());
		return true;
	}

	
	@Override
	public boolean onData(INonBlockingConnection connection) throws IOException,
			BufferUnderflowException, ClosedChannelException,
			MaxReadSizeExceededException {
		
		// TODO 自动生成的方法存根
		System.out.println("----");
		boolean searchflag=true;  //是否查到好友标志
		String serverdata=http://www.mamicode.com/connection.readStringByDelimiter("/r/n");>
客户端MainActivity源码

package com.zkq.activity;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Vector;
import org.xsocket.connection.IBlockingConnection;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.thoughtworks.xstream.XStream;
import com.zkq.helper.MySqlHelper;
import com.zkq.model.ChatMsgEntity;
import com.zkq.model.Person;
import com.zkq.model.User;
import com.zkq.util.DateFormat;
import com.zkq.util.MsgType;
import com.zkq.util.MyApp;

public class MainActivity extends Activity {
	private MySqlHelper mySqlHelper;
	private SQLiteDatabase db;
	private Button btn_login;
	private Button btn_logout;
	private Button btn_register;
	private EditText name_edit;
	private EditText password_edit;
	private XStream xStream=new XStream();
	private final int PORT=5555;
	private IBlockingConnection bc;
	private MyApp myApp;
	private Vector<UserThread> us=new Vector<UserThread>();
	private static final String TAG = MainActivity.class.getName();
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mySqlHelper = new MySqlHelper(MainActivity.this, "weixin_inf.db", null,
				1);
		db = mySqlHelper.getWritableDatabase();
		btn_login = (Button) findViewById(R.id.login);
		btn_logout = (Button) findViewById(R.id.logout);
		btn_register = (Button) findViewById(R.id.register);
		name_edit = (EditText) findViewById(R.id.username_edittext);
		password_edit = (EditText) findViewById(R.id.password_edittext);
		myApp=(MyApp) getApplication();
		bc=myApp.getBc();
		
		IntentFilter intentFilter=new IntentFilter();
		intentFilter.addAction("action.friendcircletext");
		registerReceiver(friendcircleBroadcastReceiver, intentFilter);
		
		btn_login.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				login();
			}
		});
		btn_logout.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, MenuActivity.class);
				startActivity(intent);
			}
		});
		btn_register.setOnClickListener(new OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				register_person();
			}
		});
		UserThread t1=new UserThread(bc);
		new Thread(t1).start();
		us.add(t1);
	}
	 private BroadcastReceiver friendcircleBroadcastReceiver = new BroadcastReceiver() {  
		  
	      @Override  
	      public void onReceive(Context context, Intent intent) {  
	          String action = intent.getAction();  
	          if (action.equals("action.friendcircletext"))  
	          {  
	        		System.out.println("----------成功获取朋友圈的内容");
					String name=intent.getStringExtra("name");
					String text=intent.getStringExtra("text");
					String datestr=intent.getStringExtra("date");
					System.out.println("name===="+name);
					System.out.println("text____"+text);
					System.out.println("date___"+datestr);
					ContentValues values=new ContentValues();
					values.put("name", name);
					values.put("text", text);
					values.put("date", datestr);
					db.insert("friendcircle", null, values);
					System.out.println("----------成功获取朋友圈的内容");
					System.out.println("name===="+name);
					System.out.println("text____"+text);
	          }  
	      }  
	  };  
	Handler handler=new Handler()
	{
		@Override
		public void handleMessage(android.os.Message msg) {
			
		};
	};
	
	private void login() {
		String username = name_edit.getText().toString();
		String password = password_edit.getText().toString();
		Cursor cursor = db.rawQuery("select * from person where name ='"
				+ username + "'", null);
		cursor.moveToNext();
		int count = cursor.getCount();
		if (count == 1) {
			Cursor cursor_login = db.rawQuery(
					"select name,password from person where name='" + username
							+ "'", null);
			cursor_login.moveToNext();
			if (username.equals(cursor_login.getString(0))&&password.equals(cursor_login.getString(1))) {
				login(username, password);
//				Intent intent = new Intent();
//				intent.putExtra("name", cursor_login.getString(0));
//				intent.setClass(MainActivity.this, MenuActivity.class);
//				startActivity(intent);
			//	login(username, password);
			}else {
				Toast.makeText(MainActivity.this, "账号或者密码输入错误,请重试", Toast.LENGTH_LONG).show();
				name_edit.setText("");
				password_edit.setText("");
			}
			
		}
	}
	
	private void register_person() {
		Builder builder = new Builder(MainActivity.this);
		LayoutInflater mInflater = LayoutInflater.from(MainActivity.this);
		View view = mInflater.inflate(R.layout.register, null);
		final Button btn_confirm = (Button) view.findViewById(R.id.confirm);
		final Button btn_cancel = (Button) view.findViewById(R.id.cancel);
		final EditText username_edit = (EditText) view
				.findViewById(R.id.register_user_edit);
		final EditText password_edit = (EditText) view
				.findViewById(R.id.register_password_edit);
		final EditText repassword_edit = (EditText) view
				.findViewById(R.id.register_repassword_edit);
		final AlertDialog dialog = builder.setTitle("注册").setView(view)
				.create();
		dialog.show();
		btn_confirm.setOnClickListener(new OnClickListener() {

			public void onClick(View arg0) {
				String username = username_edit.getText().toString();
				String password = password_edit.getText().toString();
				String repassword = repassword_edit.getText().toString();
				// TODO Auto-generated method stub
				if (password.equals(repassword)) {
					Cursor cursor = db.rawQuery(
							"select * from person where name='" + username
									+ "'", null);
					Log.i(TAG, "创建成功");
					//cursor.moveToNext();
					int count = cursor.getCount();
					Log.i(TAG, count + "当前的数值");
					if (count == 0) {
						ContentValues contentValues = new ContentValues();
						contentValues.put("name", username);
						contentValues.put("password", password);
						db.insert("person", null, contentValues);
						Toast.makeText(MainActivity.this, "注册成功",
								Toast.LENGTH_LONG).show();
						Cursor c=db.rawQuery(
								"select * from person where name='" + username
								+ "'", null);
						dialog.dismiss();
						cursor.close();
					}
				} else {
					Toast.makeText(MainActivity.this, "两次输入的密码不相同",
							Toast.LENGTH_LONG).show();
				}
			}
		});
	}
	
	public void login(final String name,final String password)
	{
		Thread t1=new Thread(new Runnable() {
			public void run() {
				// TODO 自动生成的方法存根
				try {
					myApp.setName(name);
					ChatMsgEntity loginMsg=new ChatMsgEntity();
					loginMsg.setName(name);
					Date date=new Date();
					String datestr=DateFormat.dateFormat(date);
					loginMsg.setDate(datestr);
					String logindata=http://www.mamicode.com/xStream.toXML(loginMsg);>
源码下载地址:
http://download.csdn.net/detail/kai46385076/8205531




使用xsocket框架实现的Android即时通讯软件