国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android使用Websocket實現聊天室

2019-10-22 18:13:25
字體:
來源:轉載
供稿:網友

最近的項目中要實現一個聊天的功能,類似于斗魚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,Websocket,聊天室

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄱阳县| 双流县| 清徐县| 台江县| 陕西省| 仁寿县| 木里| 武定县| 蓬溪县| 五大连池市| 青州市| 建德市| 修水县| 龙游县| 恭城| 阿瓦提县| 云龙县| 固阳县| 墨脱县| 常熟市| 鄂伦春自治旗| 利津县| 义乌市| 新野县| 乐业县| 日喀则市| 西贡区| 延吉市| 稻城县| 银川市| 广河县| 喜德县| 桂东县| 日照市| 罗源县| 凉城县| 蕲春县| 雷山县| 郧西县| 鹤峰县| 鹤峰县|