最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android使用Websocket實現聊天室

 更新時間:2018年03月30日 11:28:37   作者:luyouxin  
這篇文章主要為大家詳細介紹了Android使用Websocket實現聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近的項目中要實現一個聊天的功能,類似于斗魚TV的聊天室功能,與服務器端人商量后決定用WebSocket來做,但是在這之前我只知道Socket但是聽都沒有聽過WebSocket,但是查看了相關的材料以后發(fā)現實現一個聊天室其實是很簡單的!下面我們先來看看WebSocket。

Autobahn|Android 是由Autobahn開發(fā)一個開源的Java/Android網絡庫,實現了WebSocket協(xié)議和Web應用程序消息傳輸協(xié)議來創(chuàng)建本地移動的WebSocket/ WAMP的客服端。

WebSocket允許在網絡上雙向的發(fā)送實時消息,WAMP 為客服端增加了一個協(xié)議異步遠程調用、推送、訂閱。

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()是收到服務器發(fā)送給客服端的消息,onClose()是與服務器斷開走的方法,發(fā)送消息用sendTextMessage()。
我是在MsgService 實現與服務器的連接與發(fā)送消息的,直接上代碼:

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);//發(fā)送廣播給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();
 }
 }

 //發(fā)送消息的方法
 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);
 // 動態(tài)注冊廣播接收器
 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);
 }
 //接受服務端發(fā)送的消息
 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開發(fā)中用Kotlin編寫LiveData組件教程

    Android開發(fā)中用Kotlin編寫LiveData組件教程

    LiveData是Jetpack組件的一部分,更多的時候是搭配ViewModel來使用,相對于Observable,LiveData的最大優(yōu)勢是其具有生命感知的,換句話說,LiveData可以保證只有在組件( Activity、Fragment、Service)處于活動生命周期狀態(tài)的時候才會更新數據
    2022-12-12
  • Android App中實現相冊瀑布流展示的實例分享

    Android App中實現相冊瀑布流展示的實例分享

    這篇文章主要介紹了Android App中實現相冊瀑布流展示的實例分享,例子中利用到了緩存LruCache類的相關算法來解決大量加載問題,需要的朋友可以參考下
    2016-04-04
  • Android ViewFlipper的簡單使用

    Android ViewFlipper的簡單使用

    這篇文章主要為大家詳細介紹了Android ViewFlipper的簡單使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • android仿QQ個人主頁下拉回彈效果

    android仿QQ個人主頁下拉回彈效果

    這篇文章主要為大家詳細介紹了android仿QQ個人主頁下拉回彈效果的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android SeekBar實現滑動條效果

    Android SeekBar實現滑動條效果

    這篇文章主要為大家詳細介紹了Android SeekBar實現滑動條效果,可以改變并顯示當前進度的拖動,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android開發(fā)筆記之:一分鐘學會使用Logcat調試程序的詳解

    Android開發(fā)筆記之:一分鐘學會使用Logcat調試程序的詳解

    本篇文章是對Android中Logcat調試程序的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Android中EditText如何去除邊框添加下劃線

    Android中EditText如何去除邊框添加下劃線

    這篇文章主要介紹了Android中EditText如何去除邊框添加下劃線的相關資料,需要的朋友可以參考下
    2016-02-02
  • 非常實用的小功能 Android應用版本的更新實例

    非常實用的小功能 Android應用版本的更新實例

    這篇文章主要為大家詳細介紹了一個非常實用的小功能,Android應用版本的更新實例,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Flutter實現可以縮放拖拽的圖片示例代碼

    Flutter實現可以縮放拖拽的圖片示例代碼

    這篇文章主要給大家介紹了關于利用Flutter實現可以縮放拖拽的圖片的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Flutter具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • 使用PHP開發(fā)Android應用程序技術介紹

    使用PHP開發(fā)Android應用程序技術介紹

    這篇文章主要介紹了使用PHP開發(fā)Android應用程序技術介紹,本文講解了安裝PHP for Android、設置PHP for Android開發(fā)環(huán)境、使用PHP構建Android應用程序,需要的朋友可以參考下
    2015-03-03

最新評論

东乡族自治县| 卢龙县| 台前县| 大化| 万荣县| 阿克| 泽州县| 肥乡县| 紫云| 巴楚县| 双流县| 景德镇市| 桐城市| 本溪| 旅游| 彭水| 昌宁县| 来安县| 曲周县| 咸丰县| 永春县| 英吉沙县| 澄城县| 潢川县| 德惠市| 道孚县| 大连市| 凤凰县| 体育| 桑植县| 岳普湖县| 泉州市| 桐梓县| 阿拉善盟| 全州县| 大安市| 宜丰县| 马公市| 崇明县| 公安县| 五指山市|