最近的项目中要实现一个聊天的功能,类似于斗鱼TV的聊天室功能,与服务器端人商量后决定用WebSocket来做,但是在这之前我只知道Socket但是听都没有听过WebSocket,但是查看了相关的材料以后发现实现一个聊天室其实是很简单的!下面我们先来看看WebSocket。
Autobahn|Android 是由Autobahn开发一个开源的Java/Android网络库,实现了WebSocket协议和Web应用程序消息传输协议来创建本地移动的WebSocket/ WAMP的客服端。
WebSocket允许在网络上双向的发送实时消息,WAMP 为客服端增加了一个协议异步远程调用、推送、订阅。
WebSocket有以下几个特点
1.支持 WebSocket RFC6455, Draft Hybi-10+ and WAMP v1
2.支持Android 2.2以上
3.非常好的兼容性
4.高性能的异步设计
5.非常容易使用的api
6.与Android app非常好的结合
7.没有网络操作在UI线程
8.开源
下面是官网给的一段示例代码

rivate final WebSocketConnection mConnection = new WebSocketConnection();private void start() {   final String wsuri = "ws://localhost:9000";   try {      mConnection.connect(wsuri, new WebSocketHandler() {         @Override         public void onOpen() {            Log.d(TAG, "Status: Connected to " + wsuri);            mConnection.sendTextMessage("Hello, world!");         }         @Override         public void onTextMessage(String payload) {            Log.d(TAG, "Got echo: " + payload);         }         @Override         public void onClose(int code, String reason) {            Log.d(TAG, "Connection lost.");         }      });   } catch (WebSocketException e) {      Log.d(TAG, e.toString());   }}

是不是挺简单的,在onOpen()方法中做与服务器连接的操作,onTextMessage()是收到服务器发送给客服端的消息,onClose()是与服务器断开走的方法,发送消息用sendTextMessage()。
我是在MsgService 实现与服务器的连接与发送消息的,直接上代码:

public class MsgService extends Service {    private final IBinder binder = new MsgBinder();    private boolean flag = false;    private WebSocketConnection mConnection;    private Intent intent = new Intent("com.example.communication.RECEIVER");    public void startSocket(String sn) {        final String wsuri = "ws://localhost:9000";        final JSONObject json = new JSONObject();        try {            json.put("type", "command");            json.put("command", "auth");            json.put("key", Constants.API_KEY);            json.put("access_token", UserManager.getInstance().getUser()                    .getUserAccessToken());            json.put("user_token", UserManager.getInstance().getUser()                    .getLYUserToken());            json.put("sn", sn);        } catch (Exception e) {              e.printStackTrace();        }        try {            mConnection.connect(wsuri, new WebSocketHandler() {                @Override                public void onOpen() {                    if (!flag) {                        //与服务器连接认证                        mConnection.sendTextMessage(json.toString());                    } else {                    }                }                @Override                public void onTextMessage(String payload) {                    intent.putExtra("message", payload);                    sendBroadcast(intent);//发送广播给Fragment                }                @Override                public void onClose(int code, String reason) {                    //连接失败也把效应的提示信息告诉用户                    Map<String, String> map = new HashMap<>();                    map.put("status", "failed");                    map.put("type", "command");                    map.put("command", "auth");                    String msg = map.toString();                    intent.putExtra("message", msg);                    sendBroadcast(intent);                }            });        } catch (WebSocketException e) {             e.printStackTrace();        }    }    //发送消息的方法    public void sendMessage(String message) {        mConnection.sendTextMessage(message);    }    @Override    public IBinder onBind(Intent intent) {        return binder;    }    @Override    public void onCreate() {        mConnection = new WebSocketConnection();        super.onCreate();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        return super.onStartCommand(intent, flags, startId);    }    public class MsgBinder extends Binder {        /** * 获取当前Service的实例 * * @return */        public MsgService getService() {           return MsgService.this;        }    }    @Override    public void onDestroy() {        super.onDestroy();        mConnection.disconnect();    }}

下面是Fragment的代码

public class ChatRoomFragment extends Fragment {    private View view, rootView, headView;    private MsgService msgService;    private UListView chatlist;//因为ScrollVie与ListView有冲突,重写了ListView    private static List<ChatMessage> mlist;    private ChatMessage chatMessage;    private ChatMessageAdapter chatMessageAdapter;    private ScrollView scrollView;    private Handler handler = new Handler() {        public void handleMessage(Message msg) {            switch (msg.what) {                case 1:                    msgService                            .startSocket(((PlayActivity) getActivity()).getSn());                    break;                default:                    break;            }        }    };    //通过聊天室来更新在线人数    public interface UpdataOnlineUsersListener {        public void updataOnlineUser(int number);    }    private UpdataOnlineUsersListener mCallback;    private EditText messageEditText;    private Button sendBtn;    private Intent mIntent;    private MsgReceiver msgReceiver;    private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceDisconnected(ComponentName name) {            Log.d("time", "msg");        }        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            // 返回一个MsgService对象            MsgService.MsgBinder binder = (MsgService.MsgBinder) service;            if (binder != null) {                Log.d("time", "msg");            }            msgService = binder.getService();            if (msgService != null) {                Log.d("time", "msg");                Message msg = new Message();                msg.what = 1;                handler.sendMessage(msg);            }        }    };    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        view = inflater.inflate(R.layout.fragment_chat_room, container, false);        return view;    }    public void bindChatService() {        getActivity().bindService(mIntent, conn, Context.BIND_AUTO_CREATE);    }    public void destoryChatService() {        getActivity().unbindService(conn);    }    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);        mCallback = (UpdataOnlineUsersListener) (activity);    }    @Override    public void onActivityCreated(Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        // 动态注册广播接收器        msgReceiver = new MsgReceiver();        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("com.example.communication.RECEIVER");        getActivity().registerReceiver(msgReceiver, intentFilter);        mIntent = new Intent(getActivity(), MsgService.class);        bindChatService();        chatlist = (UListView) view.findViewById(R.id.chatlist);        messageEditText = (EditText) view.findViewById(R.id.input);        scrollView = (ScrollView) view.findViewById(R.id.scroll);        scrollView.setFocusable(false);        mlist = new ArrayList<ChatMessage>();        chatMessageAdapter = new ChatMessageAdapter(mlist, getActivity());        chatlist.setAdapter(chatMessageAdapter);        chatlist.setVerticalScrollBarEnabled(true);        sendBtn = (Button) view.findViewById(R.id.send);        builder = new AlertDialog.Builder(getActivity());        sendBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                final View view = v;                if (UserManager.getInstance().getUser().getGuest()) {                    ToastUtil.getInstance().showToast(getActivity(), getResources().getString(R.string.is_not_login));                } else {                    String message = messageEditText.getText().toString();                    if (!message.equals("")) {                        JSONObject json = new JSONObject();                        try {                            json.put("type", "message");                            json.put("to", "");                            json.put("message", message);                        } catch (Exception e) {                        }                        msgService.sendMessage(json.toString());                    } else {                        Toast.makeText(getActivity(),                                getResources().getString(R.string.textisnull),                                Toast.LENGTH_SHORT).show();                    }                }                HideKeyboard(v);                messageEditText.setText("");            }        });        rootView = (View) view.findViewById(R.id.rootview);        rootView.setFocusable(true);        rootView.setFocusableInTouchMode(true);        rootView.requestFocus();        setRetainInstance(true);    }    //隐藏软键盘    private void HideKeyboard(View v) {        InputMethodManager imm = (InputMethodManager) v.getContext()                .getSystemService(Context.INPUT_METHOD_SERVICE);        if (imm.isActive()) {            imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);        }    }    @Override    public void onResume() {        super.onResume();        scrollView.smoothScrollTo(0, 0);    }    //接受服务端发送的消息    public class MsgReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            String msg = intent.getStringExtra("message");            try {                JSONObject json = new JSONObject(msg);                if (json.getString("type").equals("command")) {                    String command = json.getString("command");                    if (command.equals("auth")) {                        {                            chatMessage = new ChatMessage("tips", "服务器连接中...",                                    "111", "111");                            mlist.add(chatMessage);                            chatMessageAdapter.notifyDataSetChanged();                        }                        if (json.getString("status").equals("success")) {                            chatMessage = new ChatMessage("tips", "服务器连接中成功",                                    "111", "111");                        } else {                            chatMessage = new ChatMessage("tips", "服务器连接中失败",                                    "111", "111");                        }                        mlist.add(chatMessage);                        chatMessageAdapter.notifyDataSetChanged();                    } else if (command.equals("online_status")) {                        int onlineUser = json.getInt("online");                        mCallback.updataOnlineUser(onlineUser);                    }                } else if (json.getString("type").equals("message")) {                    chatMessage = new ChatMessage(json.getString("type"),                            json.getString("from"), json.getString("content"),                            json.getString("time"));                    mlist.add(chatMessage);                    chatMessageAdapter.notifyDataSetChanged();                }                Log.d("time", mlist.toString());            } catch (JSONException e) {                e.printStackTrace();            }            chatlist.setSelection(chatMessageAdapter.getCount());//让ListView滑到最下面          }    }    @Override    public void onDestroy() {        // 停止服务        getActivity().unbindService(conn);        // 注销广播        getActivity().unregisterReceiver(msgReceiver);        super.onDestroy();    }}

这样一个简单的聊天室功能就实现了直接上图
Android用Websocket实现聊天室_第1张图片

更多相关文章

  1. Android手机访问Django测试服务器方法
  2. 如何搭建Repo服务器端
  3. Android 客户端与服务器交互
  4. Android使用xutils3框架实现应用程序内的检查更新下载服务器存放
  5. Android 4.1模拟器访问服务器接口
  6. Android 采用HttpClient提交数据到服务器
  7. Android直播实现(二)srs流媒体服务器部署
  8. Android怎么从服务器端获取数据
  9. android通过webservice连接SQL数据库(一)服务器端

随机推荐

  1. 如何删除Android自带的应用程序?
  2. Android开发从入门到精通
  3. Android Studio 错误:Invalid Android NDK
  4. Android debug.keystore 密码
  5. Android SAX API XmlResourceParser及其
  6. Android + eclipse +ADT安装完全教程
  7. Android航班时刻查询
  8. Android三级目录、ListView单选/GridView
  9. EditView某些属性说明
  10. Android 5.0 Telephony关键类初始化和相