Android使用Websocket实现聊天室

最近的项目中要实现一个聊天的功能,类似于斗鱼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.开源

下面是官网给的一段示例代码

private 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使用多线程进行网络聊天室通信
  • android socket聊天室功能实现
  • Android 基于Socket的聊天室实例
  • Android编写简单的聊天室应用
  • Android中基于XMPP协议实现IM聊天程序与多人聊天室
  • Android高仿微信聊天界面代码分享
  • Android蓝牙通信聊天实现发送和接受功能
  • android Socket实现简单聊天功能以及文件传输
  • Android仿微信语音聊天功能
  • Android Socket通信实现简单聊天室
(0)

相关推荐

  • Android中基于XMPP协议实现IM聊天程序与多人聊天室

    简单的IM聊天程序 由于项目需要做一个基于XMPP协议的Android通讯软件.故开始研究XMPP. XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,使不同的 服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议--Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段.       为了防止服务器间

  • Android高仿微信聊天界面代码分享

    微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们来看一下整个小项目的主体结构: 下面是Activity的代码: package com.way.demo; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import jav

  • android Socket实现简单聊天功能以及文件传输

    干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江湖. 如果你有好看的武侠系列小说,给我留言哦.题外话就扯这么多了,接着还是上技术. 看看今天实现的功能效果图: 可以这里使用多台手机进行通讯,我采用的服务器发送消息. 是不是只有发送消息,有些显得太单调了.好,在发送消息的基础上增加文件传输.后期会增加视频,音频的传输,增加表情包.那一起来看看图文消

  • Android编写简单的聊天室应用

    最近写了一个简单的聊天室应用,可以发送表情,更改头像这些功能.主要技术点就是怎样把表情图片放到textview等Ui控件中展示.这里废话不多说,下面是效果图: 这里主要讲下怎样把文本替换到表情,先说下思路,首先我们的图片是保存在本地资源目录drawable中而所有的资源文件都是R这个类来管理,所以我们可以利用正则表达式找出图片id包装成ImageSpan然后把ImageSpan放到SpannableString中,最后把SpannableString放入edittext中,下面是源码: pack

  • Android仿微信语音聊天功能

    本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.weichat; import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; public class AudioManager { private

  • Android Socket通信实现简单聊天室

    socket通信是基于底层TCP/IP协议实现的.这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信.socket是对TCP/IP的封装调用,本身并不是一种协议,我们通过socket来调用协议来跟服务端进行通信和数据的传输.socket就像客户端与服务端之间的一条信息通道,每一个不同的客户端都会建立一个独立的socket,双方都没有关闭连接的话,连接-也就是建立好的这条socket通道将一直保持,服务端要跟那一个客户端通信只需要找到对应的socket对

  • Android 基于Socket的聊天室实例

    Socket是TCP/IP协议上的一种通信,在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信. Client A  发信息给 Client B ,  A的信息首先发送信息到服务器Server ,Server接受到信息后再把A的信息广播发送给所有的Clients 首先我们要在服务器建立一个ServerSocket ,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待

  • Android蓝牙通信聊天实现发送和接受功能

    很不错的蓝牙通信demo实现发送和接受功能,就用了两个类就实现了,具体内容如下 说下思路把 主要有两个类 主界面类 和 蓝牙聊天服务类 . 首先创建线程 实际上就是创建BluetoothChatService() (蓝牙聊天服务类) 这个时候把handler 传过去 这样就可以操作UI 界面了,在线程中不断轮询读取蓝牙消息,当主界面点击发送按钮时 调用BluetoothChatService 的发送方法write 方法,这里的write 方法 使用了handler 发送消息,在主界面显示,另一个

  • Android使用多线程进行网络聊天室通信

    TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信了.Java对基于TCP协议的网络通信提供了良好的封装,Java使用Socket对象来代表两端通信接口,并通过Socket产生IO流来进行网络通信. 下面的程序Demo是实现一个简单的C/S聊天室的应用,每个客户端该包含两条线程:一条负责生成主界面,响应用户动作,并将用户输入的数据写入Socket对应的输出流中:另一条

  • android socket聊天室功能实现

    前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究. 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多功能. 个人Socket体验 项目主要有关智能家居,需要实现多台手机同时对灯进行操作(开或者关),主要需要实现以下几点: 1.进入界面时获取所有灯的状态. 2.一台手机改变了灯的状态,其他的手机上可以有所显示. 3.硬件上改变了灯的状态(手动开关灯),所有手机上

随机推荐