AndroidJava_WebSocket实现与后台聊天通讯

AndroidJava_WebSocket实现与后台聊天通讯

2023年7月13日发(作者:)

AndroidJava_WebSocket实现与后台聊天通讯转载请带上原著连接哦~~

弄了2天做出来的聊天,真的是⼼痛,也没什么难得东西,主要还是不熟悉,就会出错,很尴尬!先放松⼀下:来段舞蹈吧!

WebSocket简介WebSocket协议是基于TCP的⼀种新的⽹络协议。它实现了浏览器与服务器全双⼯(full-duplex)通信——允许服务器主动发送信息给客户端。WebSocket通信协议于2011年被定为标准RFC 6455,并被RFC7936所补充规范。

话不多说,先上图:不过图⽚的话也没有多少张,简单聊天⽽已嘛对了,代码写的有点粗糙,咱就这⽔平,不喜勿喷啊这次尽量发全点⼤家可以直接使⽤,是我所希望的这是采⽤recycleview绘制的聊天界⾯:

我们发送⽂字传递到后台,后台会收到我们穿的json去进⾏解析,进⾏记录 好了图⽚也就这样了,没什么⽑病,后续我们可以⾃⾏添加动态效果。

ok进⼊正题,⾛着您呢~主界⾯如下:两张.9图 放在mipmap的xhdpi中,虽然会报红,但是没关系,继续⽤就可以了在Drawable图⽚会被放⼤的

记得添加⽹络权限哦

所需要⽤的第三⽅框架

compile 't:recyclerview-v7:26.1.0' compile "-websocket:Java-WebSocket:1.3.6" compile 'it2:converter-gson:2.1.0'

主界⾯MainActivity: 已经做了相关的注释

public class MainActivity extends AppCompatActivity implements kListener, hListener { private static final int STATUS_MESSAGE = 0x00; private RecyclerView chatRecy; private ContextMsg msg; private List msgList; private ChatRecyAdapter chatRecyAdapter; private EditText editContext; private TextView txtSend;//⼤家⾃⼰找吧,我⽤的内⽹,⼤家也⽤不了的,哈哈 private static final String url = "ws://服务端地址:端⼝97/"; private URI uri; JWebSClient client; private Handler mhandler = new Handler() { @Override public void handleMessage(Message msg) { Message(msg); String mess = (String) ; switch () { case STATUS_MESSAGE: setListSent(mess, _RECEIVED); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_main); initSocketClient(); initView(); initCharRecy(); } @Override protected void onDestroy() { roy();//activity 销毁时 关闭连接 closeConnect(); } private void initView() { chatRecy = findViewById(_recy); editContext = findViewById(_context); txtSend = findViewById(_send); lickListener(this); ouchListener(this);//这⾥是对发送按钮进⾏了处理,⽤户体验吗 ,你们懂得 tChangedListener(new MyTxtSendWatcher()); } private void initCharRecy() { chatRecyAdapter = new ChatRecyAdapter(, getList()); outManager(new LinearLayoutManager(this)); pter(chatRecyAdapter); }//模拟数据 private List getList() { msgList = new ArrayList<>(); (new ContextMsg("你好", _RECEIVED)); (new ContextMsg("hello", _SENT)); (new ContextMsg("见到你很⾼兴", _RECEIVED)); (new ContextMsg("me to", _SENT)); return msgList; }//这⾥设置⽂字显⽰在recycle private void setListSent(String send, int type) { if (type == _SENT) { (new ContextMsg(send, _SENT)); t(""); } else { (new ContextMsg(send, _RECEIVED)); } chatRecyAdapter = new ChatRecyAdapter(, msgList); DataSetChanged(); ToPosition(mCount() - 1); } @Override public void onClick(View v) { switch (()) { case _send: String editText = t().toString(); setListSent(editText, _SENT); sendJsonObject(editText); break; } } private void senJsonInit() { try { JSONObject msg = new JSONObject(); ("from", 2); JSONObject init = new JSONObject(); ("type", "init"); ("msg", msg); sendMsg(ng()); Log.e("init", "Init初始化成功"); } catch (JSONException e) { tackTrace(); } } private void sendJsonObject(String context) { try { JSONObject msg = new JSONObject(); ("to", 1); ("content", context); ("from", 2); ("headimg", ""); JSONObject toOne = new JSONObject(); ("type", "msg"); ("msg", msg); sendMsg(ng()); } catch (JSONException e) { tackTrace(); } catch (Exception e) { tackTrace(); } } @Override public boolean onTouch(View v, MotionEvent event) { switch (()) { case _recy://在我们的recycleview中 触摸到后 会隐藏输⼊法键盘的 hideSoftInput(, v); break; } return false; }//显⽰输⼊法 public static void showSoftInput(Context context, View view) { InputMethodManager imm = (InputMethodManager) temService(_METHOD_SERVICE); ftInput(view, _FORCED); }//隐藏输⼊法 public static void hideSoftInput(Context context, View view) { InputMethodManager imm = (InputMethodManager) temService(_METHOD_SERVICE); ftInputFromWindow(dowToken(), 0); }//打开socket连接 private void initSocketClient() { uri = (url); client = new JWebSClient(uri) { @Override public void onMessage(String message) { Log.e("onMessage", message); ReceivedMsg receivedMsg = n(message, ); Message msg = new Message(); = STATUS_MESSAGE; = ().getContent(); ssage(msg); } }; connect(); } //连接 private void connect() { new Thread() { @Override public void run() { try { tBlocking(); Log.e("connectBlocking", "连接成功"); if(()){ senJsonInit(); } } catch (InterruptedException e) { tackTrace(); } } }.start(); } //断开连接 private void closeConnect() { try { if (null != client) { (); } } catch (Exception e) { tackTrace(); Log.e("Socket", "断开连接异常"); } finally { client = null; } } } //发送消息 /** * */ private void sendMsg(String msg) { if (null != client) { (msg); Log.e("发送的消息", msg); } } private class MyTxtSendWatcher implements TextWatcher{ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(y(t())){ ckable(false); tColor(getResources().getColor(_send_press)); }else { ckable(true); tColor(getResources().getColor(_send_normal)); } } @Override public void afterTextChanged(Editable s) { } }}

接下来使我们的websocket,因为我们使⽤的是java_websocket所以使⽤⽅法如下:

public class JWebSClient extends WebSocketClient { public JWebSClient(URI serverUri) { super(serverUri,new Draft_6455()); } @Override public void onOpen(ServerHandshake handshakedata) { Log.e("JWebSClient", "连接打开onOpen"); } @Override public void onMessage(String message) { Log.e("JWebSClient", message); } @Override public void onClose(int code, String reason, boolean remote) { Log.e("JWebSClient", "关闭 断开连接onClose"); } @Override public void onError(Exception ex) { Log.e("JWebSClient", "错误 onError"); }}很简单。也有了注释的,在mainActivity中使⽤的

对于recycleview的anapter:

public class ChatRecyAdapter extends r { private List mList; private Context mContext; private LayoutInflater inflater; public ChatRecyAdapter(Context context, List list) { mList = list; mContext = context; inflater = (context); } //onCreateViewHolder()⽤于创建ViewHolder实例 @Override public lder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == _SENT) { View view = e(_right_chat, parent, false); RightHolder rightHolder = new RightHolder(view); return rightHolder; }else if (viewType == _RECEIVED){ View view = e(_left_chat,parent,false); LeftHolder leftHolder = new LeftHolder(view); return leftHolder; } } return null; } //onBindViewHolder()⽤于对RecyclerView⼦项的数据进⾏赋值,会在每个⼦项被滚动到屏幕内的时候执⾏ @Override public void onBindViewHolder(lder holder, int position) { if (holder instanceof RightHolder) { RightHolder rightHolder = (RightHolder) holder; if (mList != null) { t((position).getContent()); geResource(_img); } }else if (holder instanceof LeftHolder){ LeftHolder leftHolder = (LeftHolder) holder; if (mList!=null){ t((position).getContent()); geResource(_img); } } } @Override public int getItemCount() { if (mList!=null) return (); else return 0; } @Override public int getItemViewType(int position) { return (position).getType(); }//左布局 public class LeftHolder extends lder { private TextView tvChatContent; private ImageView imgChatHead; public LeftHolder(View itemView) { super(itemView); tvChatContent = ewById(_content_text); imgChatHead = ewById(_item_header); } }//右布局 public class RightHolder extends lder { private TextView tvChatContent; private ImageView imgChatHead; public RightHolder(View itemView) { super(itemView); tvChatContent = ewById(_content_text); imgChatHead = ewById(_item_header); } }}看到这⾥有⼈问了,两个布局,⼀样为什么要这么写呢? 为什么,我哪知道~写别的⽅式,holder找不到你的控件,怎么办,有⼤神可以给⼀下解决⽅式吗?谢谢了

接下来就是从后台传递过来的数据,实体: public class ReceivedMsg { private String type; private ContextMsg msg; public void setType(String type) { = type; } public String getType() { return type; } public void setMsg(ContextMsg msg) { = msg; } public ContextMsg getMsg() { return msg; } public class Msg { private int to; private String content; private int from; private String headimg; public void setTo(int to) { = to; } public int getTo() { return to; } public void setContent(String content) { t = content; } public String getContent() { return content; } public void setFrom(int from) { = from; } public int getFrom() { return from; } public void setHeadimg(String headimg) { g = headimg; } public String getHeadimg() { return headimg; } }}

Gson⼯具解析json数据,已封装,使⽤⽅法就在代码中

public class GsonManager{ public static T getGson(String json,Class tClass){ Gson gson=new Gson(); return on(json,tClass); } public static String mapToJson(Map map) { Gson gson = new Gson(); String jsonStr = (map); return jsonStr; }}

⼤家根据⾃⼰需要,适当修改即可!注意:

tBlocking(); Log.e("connectBlocking", "连接成功"); if(()){ senJsonInit(); }

跟⼤家提⼀下,这⾥⽤到了connectBlocking ⽽没有⽤connect为什么呢?

1.因为后台的原因,我是需要在连接成功后传递⼀下我是哪位⽤户的,所以在连接成功后我会想后台发送⼀个json2.所以这⾥Blocking 会多出⼀个等待操作,然后我判断了连接打没打开,进⾏发送数据,否则会报错的哦,3.错误原因在于未连接就发送数据,这当然会报错。。。。。

public boolean connectBlocking() throws InterruptedException { connect(); (); return (); } 感谢各位!请认准中国驰名品牌哦~谢谢各位⽼铁⽀持~

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689215735a222235.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信